OpenSSL CBC加密IV的损坏

OpenSSL CBC加密IV的损坏,c,encryption,openssl,C,Encryption,Openssl,我试图在使用OpenSSL CBC模式将“客户”信息写入文件之前对其进行加密 当我尝试加密文本时,它不会创建加密输出,它似乎也会损坏给定的IV 它是这样的 BANK: create-user bob 1234 1 PLAINTEXT: bob IV: 9289437166649966 ENCRYPTION OF NAME OUTPUT: 0010 - <SPACES/NULS> <-- encrypting name outputs nothing PLAINTE

我试图在使用OpenSSL CBC模式将“客户”信息写入文件之前对其进行加密

当我尝试加密文本时,它不会创建加密输出,它似乎也会损坏给定的IV 它是这样的

BANK: create-user bob 1234 1
PLAINTEXT: bob
IV: 9289437166649966
ENCRYPTION OF NAME OUTPUT:
0010 - <SPACES/NULS>        <-- encrypting name outputs nothing
PLAINTEXT: 1234
IV: ��=H�W��I��%%��� <-- IV becomes unusable afterwards
ENCRYPTION OF PIN OUTPUT:
0010 - <SPACES/NULS>        <-- Still no encryption output
为了便于阅读,我省略了打印语句

生成IV的代码是:

void rand_gen(unsigned char *ret_val) {
    int i, random;
    char rand_int[2];
    ret_val[0] = '\0';
    srand(time(0));
    for(i = 0; i < 16; i++) {
            random = rand() % 10;
            if(random == 0) {
                    random = 1;
            }
            sprintf(rand_int, "%d", random);
            strcat((char *)ret_val, rand_int);
    }
该键在别处可用,这就是它不在函数args中的原因

加密输出的内容:

0010 - <SPACES/NULS>

仅供参考,通过EVP加密函数执行的算法,向任何IV馈送的IV都会被有意地在线更新。缓冲区没有被
const unsigned char*
寻址是有原因的。还有fwiw,除了你正在做的事情之外,还有很多其他的方法来生成随机IV(一点也不随机)。对不起,有点困惑,但是我应该复制一份IV并将其用于第二次加密吗?加密的数据不一定是可打印的字符串(事实上这是不太可能的)。启动调试器并检查
cipher\u name
cipher\u pin
后面的内存内容。值得注意的是,带空格/null的输出缺少前一行上明文缓冲区的有意终止字节(实际上是
char pt[]=“0123”
我故意使用整个缓冲区、终止符和全部)。我只是注意到了。真奇怪。如果可以,请并排看这两个。不管怎样,我认为你得到了你的密码文本,不管那奇怪的输出。我测试了你的函数,它似乎是正确的。你的参数被交换了。您使用(plain_buf,plain_len,IV,cipher_buf)调用encrypt,但encrypt的参数是(plain_buf,plain_len,cipher_buf,IV),因此它将(归零)cipherbuf视为IV,并将密文写入IV缓冲区。由于两个密码缓冲区均未写入任何内容,因此它们将转储为全零。同样在编辑中,您分配IV_cpy并复制到它,但在加密调用中仍然使用IV,因此IV_cpy实际上是浪费的。
int encrypt(unsigned char *plaintext, int plaintext_len, unsigned char
*ciphertext, unsigned char *IV) {
    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;
    if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();
    if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, IV)) handleErrors();
    if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len)) handleErrors();
    ciphertext_len = len;
    if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len)) handleErrors(); 
    ciphertext_len += len;
    EVP_CIPHER_CTX_free(ctx);
    return ciphertext_len;
}
0010 - <SPACES/NULS>
0000 - c7 2b 0a 46 7f 8e 2f e1-7d e6 a3 20 99 c2 7d 2b   .+.F../.}.. ..}+