jjzjj

c++ - 加密初始化 vector

coder 2024-02-15 原文

使用aes_cfb_encryptaes_cfb_decrypt函数,我有以下问题。

  • 加密中的无符号字符* iv (初始化 vector )是什么。
  • 是否需要保留 * iv 以便解密。
  • 每次我加密一块数据时, * iv 都会被修改,与此修改后的 * iv 的关系。
  • 我正在加密一个大约100mb的大文件,并第一次随机传递 * iv ,我是否必须在循环的其余部分中使用相同的 * iv ,否则我必须使用更新的 * iv加密块的最后一次调用中的
  • 最后,我正在处理结构化文件,因此我必须使用 Sizeof(struct)作为缓冲区的长度还是必须使用 sizeof(struct)* 8 作为缓冲区的长度用于加密或解密。
    请指导..
  • AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
    AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, int len, unsigned char *iv, aes_encrypt_ctx cx[1]);
    

    最佳答案

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

    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.
    

    1.什么是静脉注入(inject)?

    IV是初始化 vector 的缩写。它用于对称块加密算法中,该算法以所谓的链接或反馈模式执行其加密。在任一种情况下,前一个加密数据块都被用作功能数据段,以改变下一个要加密的数据块。每个连续的加密数据块都被馈入先前已加密的数据块,作为它们使用的粘性对象。但是第一段明文呢?它的特殊调味料有什么用?答:提供给功能的IV。从图片上看,它类似于以下内容:
    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兼容随机源算法在加密侧生成IV。

    2.是否需要保留IV以便解密?

    是的,但不一定以您可能首先想到的方式。必须以某种方式保留第一个IV(由您提供)。传统上,它会以您认为应该的位置发送给您。作为加密数据的第一块。这常常使人们感到惊讶,他们认为“但是,如果我将数据与IV一起发送,那么它就不那么安全了吗?”这样想吧。无论如何,您要发送多少“IV”?请记住,每个数据块都是使用先前的加密数据块作为其IV进行加密的。因此,您实际上是在发送一个完整的IV流,每个加密的块都为下一个加密的块发送了IV,依此类推。输出的密文中的初始IV是一个数据表示问题,但最终与该内容无关问题。必须保留它。您的API可能会在其输出流中为您执行此操作(实际上,这并不罕见)。

    3.每次我加密一个数据块时,* iv都会被修改,与此修改过的* iv有什么关系?

    我不熟悉您使用的API,但是听起来您已经获得了IV用于下一次加密,这在您考虑反馈或链接对块模式加密的工作方式时非常有意义。您不应重复使用相同的IV。使用最后返回的一个作为下一个。由于您的API正在修改IV,因此您似乎唯一需要做的就是在发送前将初始IV保存在其他位置。我将第一个密文块与您的IV进行比较。如果它们不相同,则可能需要发送IV,然后发送数据流中的密文链,并使接收者知道第一个块是解密的IV。

    4.我正在加密一个大约100mb的大文件,并第一次随机传递一个* iv,对于循环的其余部分我是否必须使用相同的* iv,或者我必须使用更新后的* iv加密块的最后一次调用。

    参见(3)。对每个后续块使用更新的IV。

    5.最后,我正在处理结构化文件,因此我将Sizeof(struct)用作缓冲区的长度,还是必须将sizeof(struct)* 8用作缓冲区的长度以进行加密或解密。

    使用结构的大小(以字节为单位)(不是位)。 C/C++ sizeof(yourstruct)应该为您计算出该值,但是请注意,如果您将每个结构作为一个独立的实体进行加密(而不是整个文件的质量),则每次加密将携带最少的数据量,以应对(a)用于该结构的IV,以及(b)假设您使用的是PKCS5填充,则将最后一个块填充到偶数块边界。因此,加密结构的确切大小为:
    IV + ((sizeof(struct) + 15)/16)*16) bytes.
    

    同样,这是如果您要单独加密和存储每个结构作为单一加密,并且同样,您的API可能会为您解决其中的一些问题。

    有关对称AES的更多信息,请参见AES entry on Wiki。有关CFB块密码模式的信息,请参见同一站点上的Block Cipher Modes of Operation文章。

    我希望这有帮助。做一些功课,最重要的是,确切地了解您的API的工作方式,不幸的是,这是我无法帮助您的。

    关于c++ - 加密初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14784962/

    有关c++ - 加密初始化 vector的更多相关文章

    1. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

      在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

    2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    3. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

      我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

    4. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

      我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

    5. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

      我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

    6. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    7. ruby - 如何计算 Liquid 中的变量 +1 - 2

      我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

    8. ruby - 为什么当我调用类的实例方法时,初始化不显示为方法? - 2

      我正在写一篇关于在Ruby中几乎一切都是对象的博客文章,我试图通过以下示例来展示这一点:classCoolBeansattr_accessor:beansdefinitialize@bean=[]enddefcount_beans@beans.countendend所以从类中我们可以看出它有4个方法(当然,除非我错了):它可以在创建新实例时初始化一个默认的空bean数组它可以计算它有多少个bean它可以读取它有多少个bean(通过attr_accessor)它可以向空数组写入(或添加)更多bean(也通过attr_accessor)但是,当我询问类本身它有哪些实例方法时,我没有看到默认

    9. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

      我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

    10. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

      我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

    随机推荐