Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 加密初始化向量_C++_C_Encryption_Pascal_Initialization Vector - Fatal编程技术网

C++ 加密初始化向量

C++ 加密初始化向量,c++,c,encryption,pascal,initialization-vector,C++,C,Encryption,Pascal,Initialization Vector,使用aes\u cfb\u encrypt和aes\u cfb\u decrypt函数,我有以下问题 什么是加密中的无符号字符*iv(初始化向量) 是否需要保留*iv进行解密 每次我加密一块数据时,*iv都会被修改,我该如何处理修改后的*iv 我正在加密一个大约100mb的大文件,并第一次随机传递一个*iv,我是否必须在循环的其余部分使用相同的*iv,或者我必须使用上次调用encrypt block时更新的*iv 最后,我处理的是结构化文件,因此我必须使用Sizeof(struct)作为缓冲区的

使用
aes\u cfb\u encrypt
aes\u cfb\u decrypt
函数,我有以下问题

  • 什么是加密中的无符号字符*iv(初始化向量)
  • 是否需要保留*iv进行解密
  • 每次我加密一块数据时,*iv都会被修改,我该如何处理修改后的*iv
  • 我正在加密一个大约100mb的大文件,并第一次随机传递一个*iv,我是否必须在循环的其余部分使用相同的*iv,或者我必须使用上次调用encrypt block时更新的*iv

  • 最后,我处理的是结构化文件,因此我必须使用Sizeof(struct)作为缓冲区的长度,或者必须使用Sizeof(struct)*8作为缓冲区的长度进行加密或解密。 请导游

  • 
    AES_返回AES_cfb_encrypt(常量无符号字符*ibuf,无符号字符*obuf,整数长度,无符号字符*iv,AES_encrypt_ctx cx[1])

    加密系统中的初始化向量(IV)是一个随机值,作为加密系统初始化的一部分,它包含在加密系统中,以确保如果相同的数据被多次加密,它返回时看起来总是不同的。这是安全加密系统的一项要求,以确保查看多个不同加密消息的攻击者无法轻松确定其中任何两个消息是否相同。理想情况下,静脉注射应完全随机选择

    您不需要保存IV进行解密。通常,IV以明文形式与加密数据一起发送。这不是一个安全问题——这是出于设计

    IV在每次加密迭代时都会更改,因为在内部,加密系统会对数据迭代应用分组密码,然后将该密码的输出与一些额外数据结合使用,作为下一次应用分组密码的新IV。然后根据需要多次迭代该过程。我怀疑(但不确定)IV已经交还给您,这样您就可以在以前中断的地方加密更多数据你一定要仔细检查一下

    至于是使用结构的大小还是八倍,我不能不看更多的代码。但是,您可能应该提供要加密的总字节数,因此如果要加密结构的八个副本,请传入结构的大小的八倍


    希望这有帮助

    在回答您的问题时,请注意以下几点:

    PT(x) = Plain Text representation of 'x'
    CT(x) = Cipher Text representation of 'x'
    Bn    = Logical Data Block 'n' in a sequence of multiple blocks.
    
    CT(B1) = Encrypt(IV + PT(B1))
    CT(B2) = Encrypt(CT(B1) + PT(B2))
    CT(B3) = Encrypt(CT(B2) + PT(B3))
    ...
    CT(Bn) = Encrypt(CT(Bn-1) + PT(Bn))
    
    1。什么是静脉注射?

    IV是初始化向量的简短符号。它用于对称块加密算法中,这些算法以所谓的链式或反馈模式执行加密。在这两种情况下,前一个加密数据块被用作功能数据“goo”,以改变下一个要加密的数据块。每一个连续的加密数据块都会作为它们要使用的一团黏液被提供给先前已经加密的数据块。但是第一块明文呢?它的特殊酱汁用什么?答:为功能提供的IV。从图形上看,它如下所示:

    PT(x) = Plain Text representation of 'x'
    CT(x) = Cipher Text representation of 'x'
    Bn    = Logical Data Block 'n' in a sequence of multiple blocks.
    
    CT(B1) = Encrypt(IV + PT(B1))
    CT(B2) = Encrypt(CT(B1) + PT(B2))
    CT(B3) = Encrypt(CT(B2) + PT(B3))
    ...
    CT(Bn) = Encrypt(CT(Bn-1) + PT(Bn))
    
    注:上面的“+”表示将先前的密码块应用于下一个明文块。它不能被认为是数学加法。可以将其视为“结合”

    IV的大小必须与使用的对称算法的块大小相同。AES-128-CFB和AES-256-CFB都使用128位块大小(16字节)。因此,在这个问题中,您的IV应该是16字节的随机goo,并且应该使用符合FIPS的安全随机源算法在加密端生成

    2。是否需要保留IV进行解密?

    是的,但不一定是你首先想到的方式。必须以某种方式保留第一个IV(由您提供)。传统上,它被发送到你认为应该的地方;作为第一块加密数据。这经常让人们感到害怕,他们认为“但是如果我发送带有数据的静脉注射,它就没有那么安全了,是吗?”这样想吧。你到底要送多少“静脉注射”?请记住,每个数据块都是使用前一个加密数据块作为其IV进行加密的。因此,实际上,您发送的是整个IV流,每个加密块都是下一个加密块的IV,等等。如果输出密文中的初始IV是数据表示问题,但它的走向最终与问题无关。必须保存它。您的API可能会将此作为其输出流的一部分来为您执行(事实上,这并不少见)

    3。每次我加密一个数据块时*iv都会被修改,我该如何处理这个修改过的*iv?

    我不熟悉你正在使用的API,但是听起来好像你被赋予了下一个加密的IV,当你考虑反馈或链接如何用于块模式加密时,这是非常有意义的。您不应该重复使用同一个IV。使用最后返回的一个作为下一个。由于您的API正在就地修改IV,因此您可能需要做的唯一一件事就是在发送之前将初始IV保存在其他地方。我会将第一个密文块与您的IV进行比较。如果它们不相同,您可能需要发送您的IV,然后发送数据流中的密文链,并让接收方知道第一个块是解密的IV

    4。我正在加密一个100mb左右的大文件,并且第一次通过随机*iv,我必须使用