【问题标题】:AES Encryption/Decryption with Bouncycastle Example in J2MEJ2ME 中使用 Bouncycastle 的 AES 加密/解密示例
【发布时间】:2011-05-13 17:17:03
【问题描述】:

我想使用带有充气城堡的 AES 算法在 J2ME 中加密和解密数据 谁能给我示例代码

我想将 ECB 与 PKCS5Padding 一起使用

提前致谢。

【问题讨论】:

    标签: java-me encryption bouncycastle aes


    【解决方案1】:

    我确定那里有示例,但我没有找到它们。这里有一些提示可以帮助您入门。您需要学习如何将 BC 类连接在一起。首先,获取 bouncycastle 源代码,并准备好在有问题时查看它。它实际上非常易读,所以当documentation 很差时不要害怕检查它。例如,许多类需要CipherParameters 对象的实例,但文档很少指定更多细节。但是,在源代码中,需要哪些实现类是显而易见的。

    选择其中一个 AES 引擎,例如 AESEngine,作为加密引擎。接下来选择一种模式; ECB 很少是正确的,例如,如果您选择 CBC 模式,则从您的 AESEngine 对象创建一个 CBCBlockCipher 对象。接下来,使用这个对象创建一个PaddedBufferBlockCipher 对象。默认构造函数使用与您想要的 PKCS5 填充相同的 PKCS7 填充。现在您需要创建一个对象来保存密钥和 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的重要性是什么??
    • 这里有一种解释:Initialization Vector
    • 尽管聚会迟到了,像我这样的人还是从谷歌上来的。初始化向量 (iv) 通常由 AES 用来帮助更好地加密的随机数填充。只需用随机数填充它,您可能不得不重复使用相同的向量来解密
    • @Igal: encrypted = new String( enc ); 不正确,会丢失信息。
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 2015-08-22
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多