Encryption j2me的AES解密

Encryption j2me的AES解密,encryption,encoding,java-me,aes,bouncycastle,Encryption,Encoding,Java Me,Aes,Bouncycastle,我读了这个链接 关于如何使用Bouncy Castle提供的AES加密字符串。加密方法代码工作正常,但解密不起作用 有人能建议我如何解密加密字符串吗 我使用了以下代码进行测试: import com.codename1.util.Base64; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.cryp

我读了这个链接 关于如何使用Bouncy Castle提供的AES加密字符串。加密方法代码工作正常,但解密不起作用

有人能建议我如何解密加密字符串吗

我使用了以下代码进行测试:

import com.codename1.util.Base64;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;

/**
 *
 * @author SAMUEL
 */
public class Tester {
    static  String strEnc = "Hi This is my String";
    final static String strPassword = "password12345678";

    private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)throws Exception
{
    int minSize = cipher.getOutputSize(data.length);
    byte[] outBuf = new byte[minSize];
    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
    int length2 = cipher.doFinal(outBuf, length1);
    int actualLength = length1 + length2;
    byte[] result = new byte[actualLength];
    System.arraycopy(outBuf, 0, result, 0, result.length);
    return result; 
}

private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception
{
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
    aes.init(false, ivAndKey);
    return cipherData(aes, cipher);
}

private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception
{
    PaddedBufferedBlockCipher  aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
    aes.init(true, ivAndKey);
    return cipherData(aes, plain);
}


public static void main(String [] args) throws Exception{

    byte[] enc= encrypt(strEnc.getBytes(),"password12345678".getBytes(), "password12345678".getBytes());
    String encrypted =   Base64.encode(enc);
    System.out.println("Encrypted is:"+encrypted);
    byte[] dec= decrypt(encrypted.getBytes(),"password12345678".getBytes() , "password12345678".getBytes());        
    System.out.println("Decrypted file is:"+dec);
 }
}
输出为:

Encrypted is:sw0SrUIKe0DmS7sRd9+XMgtYg+BUiAfiOsdMw/Lo2RA=
异常stacktrace是:

Exception in thread "main" org.bouncycastle.crypto.DataLengthException: last block incomplete in decryption
    at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(PaddedBufferedBlockCipher.java:281)
    at com.mycompany.myapp.Tester.cipherData(Tester.java:28)
    at com.mycompany.myapp.Tester.decrypt(Tester.java:40)
    at com.mycompany.myapp.Tester.main(Tester.java:57)

您忘记了在解密之前对密文进行解码。您还应该从解密的字节创建一个新字符串

编码/解码字符串时,始终明确指定编码,否则将使用平台默认值,这在每个平台上都不相同


因此,使用例如
newstring(dec,“UTF-8”)
重新创建明文,并为每个
newstring()
toBytes()
方法指定
“UTF-8”

您忘记了在解密之前对密文进行64进制解码。您还应该从解密的字节创建一个新字符串

编码/解码字符串时,始终明确指定编码,否则将使用平台默认值,这在每个平台上都不相同


因此,使用例如
newstring(dec,“UTF-8”)
重新创建明文,并为每个
newstring()
toBytes()
方法指定
“UTF-8”

您忘记了在解密之前对密文进行64进制解码。您还应该从解密的字节创建一个新字符串

编码/解码字符串时,始终明确指定编码,否则将使用平台默认值,这在每个平台上都不相同


因此,使用例如
newstring(dec,“UTF-8”)
重新创建明文,并为每个
newstring()
toBytes()
方法指定
“UTF-8”

您忘记了在解密之前对密文进行64进制解码。您还应该从解密的字节创建一个新字符串

编码/解码字符串时,始终明确指定编码,否则将使用平台默认值,这在每个平台上都不相同



因此,使用例如
newstring(dec,“UTF-8”)
来重新创建纯文本,并为每个
newstring()
toBytes()
方法指定
“UTF-8”

首先,这个问题包含的信息太少。第二,我想知道你是否阅读了你所指答案下面的评论。它包含指向我的主要问题的链接。。我做到了,它可以很好地进行加密,但我在解密方面遇到了问题,这就是为什么我是askinEh,你的代码又在哪里?如果你可以编辑你的问题,我很乐意收回我的投票(这些投票主要是在我们无法回答问题时给出的,如果我们不想回答问题时就不会给出太多)。我是这个网站的新手,所以我尝试发布我的代码,但由于未知的原因,我不能。但这是我在codenameone论坛上的代码。。。首先,这个问题包含的信息太少。第二,我想知道你是否阅读了你所指答案下面的评论。它包含指向我的主要问题的链接。。我做到了,它可以很好地进行加密,但我在解密方面遇到了问题,这就是为什么我是askinEh,你的代码又在哪里?如果你可以编辑你的问题,我很乐意收回我的投票(这些投票主要是在我们无法回答问题时给出的,如果我们不想回答问题时就不会给出太多)。我是这个网站的新手,所以我尝试发布我的代码,但由于未知的原因,我不能。但这是我在codenameone论坛上的代码。。。首先,这个问题包含的信息太少。第二,我想知道你是否阅读了你所指答案下面的评论。它包含指向我的主要问题的链接。。我做到了,它可以很好地进行加密,但我在解密方面遇到了问题,这就是为什么我是askinEh,你的代码又在哪里?如果你可以编辑你的问题,我很乐意收回我的投票(这些投票主要是在我们无法回答问题时给出的,如果我们不想回答问题时就不会给出太多)。我是这个网站的新手,所以我尝试发布我的代码,但由于未知的原因,我不能。但这是我在codenameone论坛上的代码。。。首先,这个问题包含的信息太少。第二,我想知道你是否阅读了你所指答案下面的评论。它包含指向我的主要问题的链接。。我做到了,它可以很好地进行加密,但我在解密方面遇到了问题,这就是为什么我是askinEh,你的代码又在哪里?如果你可以编辑你的问题,我很乐意收回我的投票(这些投票主要是在我们无法回答问题时给出的,如果我们不想回答问题时就不会给出太多)。我是这个网站的新手,所以我尝试发布我的代码,但由于未知的原因,我不能。但这是我在codenameone论坛上的代码。。。它显示:这是一个字节数组实例(
[B
)由
a62fc3
识别。你可以通过接受来表示感谢。虽然我认为我们没有关系,但尽量不要使用太流行的语言,这对SO的可读性和外观都没有帮助。您好。这很有效,我可以加密和解密,但我注意到当我使用aes加密和解密字符串时,结果不同从通常的标准aes加密/解密(例如,在设备上):“hello”是“01Fvdltwa2VKVPCH3ueHAA=”,但在标准aes上,“hello”是“0tUfc3Qwod0qw1kVaI8ksw=”。如何解决此问题请确保编码、操作模式、密钥字节和IV字节是相同的。请注意,对于同一密钥,您应该使用不同的IV-实际上,密文将始终不同(否则您将泄漏信息;您将能够区分是否加密了(开始)相同的纯文本两次)。它在我的