AES128 Decryption异常

昨日AES解密出现异常,有两种异常信息:
1.javax.crypto.badpaddingexception pad block corrupted
2.解决IllegalBlockSizeException:last block incomplete in decryption异常
在网上查询,原因可能如下:
1.如http://blog.csdn.net/yf210yf/article/details/7863066 中所说,但是我代码中已经是对结果进行过base64加解密的,所以该方案无效。

2.参考http://stackoverflow.com/questions/23491143/aes128-decryption-javax-crypto-badpaddingexception-pad-block-corrupted
对String常量存储的key直接进行getByte()可能会丢失信息,造成key不一致,所以解密失败
解决方案:
使用 SecureRandomsr=SecureRandom.getInstance("SHA1PRNG","SUN")

原获取SecretKeySpec代码如下:

    //如下该行可能出现丢失信息的情况
    byte[] keys = originalKey.getBytes(CHAR_SET);

        byte[] bytes = new byte[128 / 8];
        for (int i = 0; i < bytes.length; i++) {
            if (keys.length > i) {
                bytes[i] = keys[i];
            }else{
                bytes[i] = 0;
            }
        }

        return new SecretKeySpec(bytes, "AES");
    }

修改后获取SecretKeySpec代码如下:

        byte[] raw = null;
        try {
            byte[] keys = originalKey.getBytes(CHAR_SET);
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
            sr.setSeed(keys);
            keyGenerator.init(128, sr);
            SecretKey skey = keyGenerator.generateKey();
             raw = skey.getEncoded();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return new SecretKeySpec(raw, "AES");
AES128 ECB PKCS5Padding算法是一种对称加密算法,具有较快的加密速度和较高的安全性。 在C代码中实现上述算法,我们需要使用相关的库函数。以OpenSSL为例,在C语言中可以使用OpenSSL提供的API进行AES128 ECB PKCS5Padding的加解密操作。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <openssl/aes.h> int main() { // 原始数据 unsigned char plaintext[17] = "Hello, world!"; unsigned char ciphertext[16]; unsigned char recoveredtext[16]; // 密钥 unsigned char aes_key[16] = "1234567890123456"; AES_KEY key; // 设置加密密钥 if (AES_set_encrypt_key(aes_key, 128, &key) < 0) { printf("Error setting encryption key.\n"); return -1; } // 加密 AES_encrypt(plaintext, ciphertext, &key); // 解密 if (AES_set_decrypt_key(aes_key, 128, &key) < 0) { printf("Error setting decryption key.\n"); return -1; } AES_decrypt(ciphertext, recoveredtext, &key); printf("Plaintext: %s\n", plaintext); printf("Ciphertext: "); for (int i = 0; i < 16; i++) { printf("%02x ", ciphertext[i]); } printf("\n"); printf("Recovered text: %s\n", recoveredtext); return 0; } ``` 上述代码中,我们首先定义了原始数据(明文)`plaintext`,密钥`aes_key`以及存储加密后数据(密文)`ciphertext`和解密后数据(恢复文本)`recoveredtext`的数组。然后,使用`AES_set_encrypt_key`函数设置加密密钥,并调用`AES_encrypt`函数进行加密操作。再使用`AES_set_decrypt_key`函数设置解密密钥,并调用`AES_decrypt`函数进行解密操作。最后,打印输出明文、密文和恢复文本。 需要注意的是,ECB模式不适合处理大量数据加密,因为它没有使用初始化向量,相同的明文将会得到相同的密文,存在安全性隐患。而且ECB模式也没有提供数据完整性验证,因此在实际应用中,建议使用更为安全的加密模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值