【问题标题】:AES decrypt for j2mej2me 的 AES 解密
【发布时间】:2014-09-18 13:23:59
【问题描述】:

我在此链接上阅读 AES Encryption/Decryption with Bouncycastle Example in J2ME 关于如何使用 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=

异常堆栈跟踪是:

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)

【问题讨论】:

  • 首先,这个问题包含的信息太少了。其次,我想知道您是否甚至阅读了您所指向的答案下方的 cmets。
  • 它包含指向我遇到的主要问题的链接.. 我做到了,它可以很好地用于加密,但我在解密时遇到问题,这就是我问的原因
  • 呃,哪里又是你的代码?如果您可以编辑您的问题,我很乐意撤回我的近距离投票(这些投票主要是在我们无法回答问题时给予,如果我们不想回答问题则不是那么多) .
  • 我是这个网站的新手,所以我尝试发布我的代码,但由于未知原因,我不能。但这是我在代号论坛上的代码...groups.google.com/forum/…

标签: encryption encoding java-me aes bouncycastle


【解决方案1】:

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

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

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

【讨论】:

  • 它显示:这是一个由a62fc3标识的字节数组实例([B)。
  • 您可以通过接受表示感谢。我不认为我们是相关的,尽量不要在 SO 上使用太流行的语言,它不利于 SO 的可读性和外观。
  • 嗨。这已经奏效,我可以加密和解密,但我注意到当我使用 aes 加密和解密字符串时,但我注意到结果与通常的标准 aes 加密/解密不同,例如在设备上:“hello”是“01Fvdltwa2VKVPCH3ueHAA==”但是在标准 aes 上“你好”是“0tUfc3Qwod0qw1kVaI8ksw==”。请问我该如何解决这个问题
  • 确保编码、操作模式、密钥字节和 IV 字节相同。请注意,对于相同的密钥,您应该使用不同的 IV - 实际上密文会总是不同(否则您会泄漏信息;您将能够区分您是否加密了(开始)两次相同的明文)。
  • 它在我的设备上运行良好。我设备上的输出与aesencryption.net 上的输出不同。这是我现在面临的问题,因为我想与我的服务器交换数据,即使它们使用相同的密钥,但我不能这样做,因为我的服务器 aes 加密/decryption 与我的设备 aes 加密/解密不一样...希望你明白我的意思???
猜你喜欢
  • 2011-05-13
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2021-02-11
  • 1970-01-01
  • 2012-02-24
  • 2017-04-12
相关资源
最近更新 更多