如何将这种确定性计数器模式更改为随机计数器模式密码?我了解到我们必须将固定计数器值设置为随机值。。。我不知道怎么做……有人能详细解释一下吗?编码noob需要详细解释。。。
#include <stdio.h>
#include <openssl/bn.h>
#include <openssl/aes.h>
#define mSize 4
void block_xor(unsigned char z[16], unsigned char x[16], unsigned char y[16])
{
for (int i=0; i<16; i++)
z[i] = x[i] ^ y[i];
}
int main(int argc, char* argv[]){
BIGNUM *key = BN_new();
unsigned char userkey[32];
int size = 128;
AES_KEY enckey,deckey;
BN_rand(key, size, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY);
BN_bn2bin(key, userkey);
AES_set_encrypt_key(userkey, size, &enckey);
//AES_set_decrypt_key(userkey, size, &deckey);
unsigned char m[16*mSize+1] = "Practice randomized CTR mode";
unsigned char enc[16*mSize+1] = {0};
unsigned char dec[16*mSize+1] = {0};
unsigned char counter[16];
unsigned char blockkey[16];
for(int i =0; i<mSize; i++){
sprintf(counter, "%d", i);
AES_encrypt(counter, blockkey, &enckey); // *** F(k,i) == F(enkey, counter) == blockkey
block_xor(&enc[16*i], &m[16*i], blockkey);
//enc[i] = m[i] ^ blockkey
}
printf("enc: %sn", enc);
for(int i =0; i<mSize; i++){
sprintf(counter, "%d", i);
AES_encrypt(counter, blockkey, &enckey);
block_xor(&dec[16*i], &enc[16*i], blockkey);
}
printf("dec: %sn", dec);
return 0;
}
通过创建字节数组(C中的char
数组(来创建特定大小的nonce。例如,您可以使用8个字节中的一个(这可能是最小的,因为您必须记住生日问题(。然后用随机字节填充这个数组。
然后将随机数复制到计数器的最高有效位。计数器通常是一个大端值,所以这意味着从左边(较低的索引(到右边。计数器的剩余字节被设置为零。
最后,如果你有一个随机的nonce,你需要将其包含在密文中,否则进行加密的实体无法知道它,解密就会失败(你用相同的方法同时进行这两种操作是在作弊(。
现在您可以通过加密计数器并在之后增加计数器来创建密钥流。然后将明文/密文与密钥流进行异或运算。
顺便说一句,此功能在您的代码中丢失和/或不正确。你看不到这一点,因为在加密和解密过程中也会出现同样的错误。请注意,在密码学中,运行代码并不意味着安全代码。