在J2ME中使用Bouncycastle示例进行AES加密/解密

4
我想使用Bouncy Castle库,在J2ME中使用AES算法加密和解密数据,你能否提供样例代码?
我希望使用ECB模式并采用PKCS5Padding填充。
谢谢。
1个回答

20
我确信这方面已经有例子了,但我还没有找到。以下是一些提示,以帮助你入门。你需要学习如何将BC类连接在一起。首先,获取bouncycastle源代码,并准备好在遇到问题时查看它。实际上,它非常易读,所以不要害怕在文档不太清楚的情况下仔细研究它。例如,许多类都需要一个CipherParameters对象的实例,但很少有文档会指定更多的细节。然而,在源代码中,期望哪些实现类将是显而易见的。
选择其中一个AES引擎,例如AESEngine,作为加密引擎。接下来选择一个模式;ECB很少是正确的,因此,例如,如果你选择CBC模式,则从你的AESEngine对象创建一个CBCBlockCipher对象。接下来,使用此对象创建一个PaddedBufferBlockCipher对象。默认构造函数使用PKCS7填充,它与你想要的PKCS5填充相同。现在,你需要创建一个对象来保存密钥和IV。这是CipherParameters接口。你可以分两步创建对象。首先,用你的密钥创建一个KeyParameter对象。接下来,用你的KeyParameter对象和你的IV创建一个ParametersWithIV对象。将此对象提供给PaddedBufferBlockCipher对象的init方法,然后就可以开始了。
编辑

这里是一个小例子:

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);
}

如何在J2ME中生成IV,IV的重要性是什么? - Mihir Palkhiwala
2
这里有一个解释:初始化向量(IV) - President James K. Polk
1
尽管有些晚了,像我这样的人通过谷歌搜索来到这里。初始化向量(iv)通常填充AES用于更好加密的随机数。只需填充随机数即可,并且您可能需要重复使用相同的向量进行解密。 - Joe Plante
1
@Igal:encrypted = new String( enc ); 这样做是不正确的,会丢失信息。 - President James K. Polk
@Igal:通常情况下,base 64编码是最好的选择。 - President James K. Polk
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接