当前位置: 首页 > 知识库问答 >
问题:

实施AES的CBC操作模式

冯育
2023-03-14

我有一个128,192和256位密钥的AES密码的实现。我正在尝试实现分组密码模式的操作,目前正在实现密码分组链接模式。

关于CBC模式的实施,我有两个问题:

1.这是关于向密码例程提供数据的,我在<code>cbc()中调用密码例程\\此函数实现cbc模式</code>。我的问题是,我应该读取<code>cbc()</code>中的文件(包含用于加密的数据),还是可以读取<code>cbc(()<-code>之外的文件,并将数据块作为协议传递给<code>cbc(。哪一个是安全的实现。

2.CBC模式需要一个随机生成的初始化向量aka IV(为此我在c 11中使用了一个随机字节生成器),因为用户只在加密/解密时输入密钥,我怎么知道文件加密时使用的初始化向量是什么呢?此外,如果我需要给用户静脉注射,怎么做?

我正在C 11中实现这些。

谢谢。

共有1个答案

梁修贤
2023-03-14

我应该读取 cbc() 中的文件(包含用于加密的数据),还是可以读取 cbc() 外部的文件并将数据块传递给 cbc() 作为附件?

您肯定希望将数据作为参数传递,以便 CBC 函数可以与其他数据源一起使用。你看,你不一定只加密一个文件,也许你会想在某个时候加密一些套接字传输。

哪一个是安全实现?

这两个选项都可以安全地实现,也可以不安全地实现。没有一种方法比另一种更安全,这实际上取决于实现本身。现在我不会在这里深入探讨安全问题,因为我相信你已经读了很多遍,编码你自己的任何密码算法的实现都是可能的,而且大多数时候都是不安全的,但是你应该记住一件事,而且很容易做到的是——使用缓冲区后擦除它们!例如,当你读取你的文件时,你将数据存储在某个向量或字符串中,这些向量或字符串在其生命周期结束时会被销毁,这是可以的,但是数据仍然在内存中,它们没有被擦除。所以如果你用一个指针指向数据,销毁向量并查看指针指向的数据,原始数据将仍然存在,直到这块内存不再用于存储其他东西。为此,你需要使用一些自定义分配器。

如果你想要一些CBC实现的工作示例,你可以看看我的CBC实现。现在我不是专家,所以有一些可能的问题,我可以在实现它时忽略。

我如何知道加密文件时使用的初始化向量是什么。另外,如果我需要把IV给用户,如何?

初始化向量不是私有的,您可以简单地以任何方式存储它。例如,您可以将IV存储在加密文件中,这样用户就不必担心它了
类似于:[IV][HMAC][CIPHER]

然后,在解密时,您可以读取“头”,使用HMAC验证数据(它告诉您提供的密码是否正确),然后解密数据。

 类似资料:
  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 我正在开发一个聊天应用程序。其主要特点是以加密形式发送消息,当消息到达目的地时,可以对消息进行解密。我遇到的问题是,这些消息在它们的目的地没有被解密,但是它们以加密的形式到达它们的目的地。 > 客户端A向客户端B发送消息“Hello”.. 当客户端A单击“发送消息”按钮时,我将文本保存为字符串,然后该字符串与密钥和iv一起传递给方法加密,如下所示... 我将字节()转换为字符串并将其发送给其他客户

  • 问题内容: 我正在尝试编写一个简单的Java程序,该程序将使用加密纯文本。有上课: 有可能的用法: 我的输出是,但是执行此命令时: 我得到的东西与Java程序()有所不同。可悲的是,我不知道为什么结果不一样,因为我使用相同的算法和相同的键和iv。这是否意味着我的Java程序无法正常运行?任何帮助,将不胜感激。 问题答案: 两种方法都可以正常工作,但是您正在加密不同的事物。 此处的字符串语法()在字

  • 我正在使用这个库:https://tls.mbed.org/download用ESPRESIF ESP32。目标是使用AES-CTR加密一些数据,然后将密码文本解密回原始纯文本。我解密后得到的结果不正确。 因为我们使用的是CTR模式,所以不需要单独的“解密”功能;我们可以只调用一次encrypt函数进行加密,然后再调用同一个函数一次,它就会解密。至少,大多数消息来源都是这么说的,其他实现也是如此:

  • 问题内容: PHP加密功能 当我尝试使用下面的函数在Java中解密此结果时,我得到的只是“ Test @ string”,而我则是“ @@BKxnfÈ〜¯Ô’M”。有什么想法我错了吗?谢谢 问题答案: 编辑:从Java 8开始,Java现在包括可接受的Base64类。 这条线 看起来错了。而是使用apache commons编解码器类或Harder base64 类。同样,mcrypt使用的默认填