【问题标题】:OpenSSL Encryption AES 128bit CBCOpenSSL 加密 AES 128 位 CBC
【发布时间】:2020-04-15 02:24:52
【问题描述】:

当我运行这个程序时,AES_cbc_encrypt 在每个循环中都会产生不同的密码。有没有办法重置状态,以便在每个循环期间产生相同的密码?

void main() 
{
int i;
unsigned char iv[]  = "\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00\xA2\xB2\xC2\xD2\xE2\xF2";
unsigned char plaintxt[] = "\x25\x50\x44\x46\x2d\x31\x2e\x35\x0a\x25\xd0\xd4\xc5\xd8\x0a\x34";
unsigned char ciphertext[] = "\xd0\x6b\xf9\xd0\xda\xb8\xe8\xef\x88\x06\x60\xd2\xaf\x65\xaa\x82";
unsigned char cipher[128];
char key[] = "\x95\xfa\x20\x30\xe7\x3e\xd3\xf8\xda\x76\x1b\x4e\xb8\x05\xdf\xd7";


for(int j = 0; j < 10; j++) {

    AES_KEY aeskeyEnc;
    AES_set_encrypt_key(key, 128, &aeskeyEnc);
    AES_cbc_encrypt(plaintxt, cipher, 33, &aeskeyEnc, iv, AES_ENCRYPT);


    for (i = 0; i < KEYSIZE; i++) {     
        printf("%.2x", (unsigned char)cipher[i]);
    }
    printf("\n");
}   
}

【问题讨论】:

  • 这是密码块链接的一项功能,对安全性很重要。电子密码本每次都会产生相同的结果,但你必须有一个非常非常好的理由,因为它大大削弱了加密。你想完成什么?
  • @SteveFriedl IV 是固定的。 OpenSSL 保持状态。
  • 我猜,有缓冲区溢出?
  • @SteveFriedl 我的明文正好是一个块(128bit)长,所以即使是CBC也应该产生相同的密文吧?
  • 您是否检查了默认填充?在这种情况下你应该说没有填充。

标签: c encryption openssl aes


【解决方案1】:

没关系,似乎是因为某些奇怪的原因 AES_cbc_encrypt 函数修改了 IV。

for(int j = 0; j < 10; j++) {

    AES_KEY aeskeyEnc;
    unsigned char iv[]  = "\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00\xA2\xB2\xC2\xD2\xE2\xF2";
    AES_set_encrypt_key(key, 128, &aeskeyEnc);
    AES_cbc_encrypt(plaintxt, cipher, 33, &aeskeyEnc, iv, AES_ENCRYPT);


    for (i = 0; i < KEYSIZE; i++) {     
        printf("%.2x", (unsigned char)cipher[i]);
    }
    printf("\n");
}   

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2018-12-31
    相关资源
    最近更新 更多