如何构建随机化的CTR模式?
How to construct radomized CTR mode?
如何将这种确定性计数器模式更改为随机计数器模式密码?
我了解到我们必须将一个固定的计数器值设置为随机值...我不知道该怎么做...有人可以详细解释一下吗?编码菜鸟需要详细解释...
#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: %s\n", 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: %s\n", dec);
return 0;
}
通过创建字节数组(C 中的 char
数组)来创建特定大小的随机数。例如,您可以使用 8 个字节之一(这可能是最小值,因为您必须牢记生日问题)。然后你用随机字节填充这个数组。
随机数随后被复制到计数器的最高有效位。计数器通常是一个大端值,因此这意味着从左侧(较低的索引)到右侧。计数器的剩余字节设置为零。
最后,如果您有一个随机随机数,则需要将其包含在您的密文中,否则进行加密的实体无法知道它并且解密将失败(您以相同的方法同时进行这两种操作是作弊)。
现在您可以通过加密计数器创建密钥流,然后增加计数器。然后将明文/密文与密钥流进行异或运算。
顺便说一下,此功能在您的代码中缺失和/或不正确。你看不到这一点,因为在加密和解密过程中会犯同样的错误。请注意,运行 代码并不意味着密码学中的安全代码。
如何将这种确定性计数器模式更改为随机计数器模式密码? 我了解到我们必须将一个固定的计数器值设置为随机值...我不知道该怎么做...有人可以详细解释一下吗?编码菜鸟需要详细解释...
#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: %s\n", 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: %s\n", dec);
return 0;
}
通过创建字节数组(C 中的 char
数组)来创建特定大小的随机数。例如,您可以使用 8 个字节之一(这可能是最小值,因为您必须牢记生日问题)。然后你用随机字节填充这个数组。
随机数随后被复制到计数器的最高有效位。计数器通常是一个大端值,因此这意味着从左侧(较低的索引)到右侧。计数器的剩余字节设置为零。
最后,如果您有一个随机随机数,则需要将其包含在您的密文中,否则进行加密的实体无法知道它并且解密将失败(您以相同的方法同时进行这两种操作是作弊)。
现在您可以通过加密计数器创建密钥流,然后增加计数器。然后将明文/密文与密钥流进行异或运算。
顺便说一下,此功能在您的代码中缺失和/或不正确。你看不到这一点,因为在加密和解密过程中会犯同样的错误。请注意,运行 代码并不意味着密码学中的安全代码。