如何构建随机点击率模式?

如何将这种确定性计数器模式更改为随机计数器模式密码?我了解到我们必须将固定的计数器值设置为随机值...我不知道该怎么做...有人可以详细解释它吗?编码菜鸟需要详细的解释...

#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;

}
马丁·波德威斯

通过创建字节数组(charC中数组)来创建一定大小的随机数例如,您可以使用8个字节之一(可能是最小字节,因为您必须牢记生日问题)。然后,用随机字节填充此数组。

然后将现时值复制到计数器的最高有效位。计数器通常是大端序值,因此意味着从左侧(较低的索引)到右侧。计数器的剩余字节设置为零。

最后,如果您拥有随机随机数,则需要将其包含在密文中,否则进行加密的实体将无法知道它,并且解密将失败(您将通过相同的方法进行欺骗)。


现在,您可以通过加密计数器并随后增加计数器来创建密钥流。然后,将明文/密文与密钥流进行异或。

顺便说一句,此功能在您的代码中丢失和/或不正确。您看不到它,因为在加密和解密过程中会犯同样的错误。注意,运行代码并不意味着密码学中的安全代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章