问题标签 [aes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
3660 浏览

encryption - 使用什么分组密码模式?CFB 够用吗?

我想使用 AES 加密一些任意长度的数据,我想知道我应该使用什么分组密码模式。http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html建议在 CTR 模式下使用 AES。我正在编写一个 Ruby on Rails 插件,不幸的是 OpenSSL(Ruby 有标准绑定)不支持 CTR。我希望我的代码能够为所有人开箱即用,而不需要他们安装第三方加密库,所以现在我使用的是 CFB。CFB 可以接受吗?它与 CTR 或其他模式相比如何(ECB 除外,我知道这是不安全的)?

0 投票
2 回答
7738 浏览

c# - 将 byte[] 填充到 16 字节的倍数以进行 AES 加密

我目前有一个函数 [C#],它需要一个字节 [] 和一个对齐来设置它,但是在加密期间,每隔一段时间就会抛出一个错误。

有人看到该功能有任何问题吗?我收到错误,内容大小在 AES 加密期间无效,这表明它没有正确填充。

0 投票
3 回答
2837 浏览

ruby-on-rails - 为 Rails 编写加密的 cookie 会话存储;我的方法安全吗?

默认情况下,Ruby on Rails 将会话数据存储在 cookie 中。这有很多优点,例如不需要在服务器端设置任何持久层。但是,会话数据未加密,并且我正在编写的 Rails 应用程序将潜在的敏感数据放入会话中。如果可能,我想避免在服务器端存储会话数据,并且 Rails 唯一现有的加密 cookie 存储实现似乎已被放弃,所以我正在编写自己的加密 cookie 存储。

Rails cookie 会话存储的工作方式如下:

  1. 它将会话数据序列化为字节字符串。
  2. 序列化数据转换为base64。
  3. base64 数据由 HMAC 附加。Rails 要求 HMAC 密钥至少为 30 字节;默认情况下,Rails 生成一个 128 字节的随机字符串作为密钥,从 /dev/urandom 获得。用于 HMAC 的默认散列算法是 SHA-1。
  4. base64 数据 + HMAC 作为 cookie 发送到 HTTP 客户端。
  5. 当客户端执行请求时,Rails 首先检查 HMAC 验证是否成功。如果不是,那么它将默默地丢弃 cookie 中的会话数据,就好像用户根本没有发送任何会话数据一样。这也意味着如果管理员更改了 HMAC 密钥,那么所有旧会话都会自动失效。
  6. base64 数据经过 de-base64 处理并解组为 Ruby 数据结构。

我正在编写的加密 cookie 会话存储是普通 cookie 存储类的子类。它的工作原理如下:

  • 它插入了第 3.5 步:在第 3 步之后,它将加密数据。
  • 它修改了第 5 步:在检查 HMAC 之前,它解密数据。
  • 加密算法为 CFB 模式下的 AES-256。我知道 EBC 会暴露重复模式。
  • 该代码要求管理员指定正好为 32 个字节的加密密钥。加密密钥未经过哈希处理。默认情况下,它建议从 /dev/urandom 获得随机生成的恰好 32 字节的加密密钥。
  • 它还要求管理员指定正好为 16 个字节的初始化向量。IV 没有经过哈希处理,默认情况下,它建议使用从 /dev/urandom 获得的随机生成的 IV。

我之所以在加密之前使用 HMAC(而不是在加密之后使用 HMAC)是因为我希望能够检测到加密密钥或 IV 的更改。如果更改了加密密钥或 IV,我希望该软件自动使旧会话无效。如果我在加密后进行 HMAC,那么如果我更改加密密钥或 IV,HMAC 验证将通过,这是不可取的。

我的方法安全吗?如果没有,那还缺少什么?

几点注意事项:

  • 我想按照http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html的建议使用 CTR,但不幸的是 OpenSSL(包含在 Ruby 标准库中)没有t 支持 CTR,我不想要求我的用户安装单独的第三方加密库。
  • 我想为 HMAC 使用 SHA-256。daemonology.net 建议不要使用 SHA-512,因为可能存在“对 32 位系统的侧信道攻击”(无论这意味着什么)。但是,并非每个平台都支持 SHA-256 作为 HMAC 的散列算法。最值得注意的是,OS X 上的 Ruby 不支持 HMAC+SHA256。我希望我的代码也能在 OS X 上开箱即用。
0 投票
1 回答
15827 浏览

.net - 让 .NET 中的 SlowAES 和 RijndaelManaged 类一起玩

我正在尝试使用 JavaScript 库SlowAES和 .NET 中的RijndaelManaged类设置 AES 加密/解密。

我在阅读这篇文章后选择了这种方法,Cheeso 已经设法让这两种加密方法一起发挥作用

“在我对 COM-wrapped-SlowAEs 的测试中,我使用了 CBC 模式,并且加密与 .NET 中的 RijndaelManaged 类完全兼容” - Cheeso

我从 Cheeso 的 Windows 脚本组件、最新的 slowaes 库中获取了 javascript 代码,并使用以下 javascript 脚本进行测试:

我得到以下输出:

我修改了MSDN 上的以下示例,以尝试匹配 C# 中的加密:

观察字节数组:

我已经尝试了托管 .NET 类的所有填充选项,但是我无法让加密的输出匹配。谁能帮我?

谢谢,

鲍勃

0 投票
11 回答
134947 浏览

java - 部署应用程序时如何避免安装“无限强度”JCE 策略文件?

我有一个使用 256 位 AES 加密的应用程序,Java 不支持开箱即用。我知道要让它正常运行,我在安全文件夹中安装了 JCE 无限强度 jar。这对我作为开发人员来说很好,我可以安装它们。

我的问题是,由于这个应用程序将被分发,最终用户很可能不会安装这些策略文件。让最终用户下载这些只是为了使应用程序功能不是一个有吸引力的解决方案。

有没有办法让我的应用程序在不覆盖最终用户机器上的文件的情况下运行?无需安装策略文件即可处理的第三方软件?或者只是从 JAR 中引用这些策略文件的方法?

0 投票
1 回答
2365 浏览

c++ - OFB和CFB哪个更安全?

我正在做一个小项目,使用 AES 加密并想在流模式下使用它,这被认为是更“适合”套接字使用的模式?OFB还是CFB?我一直在阅读它并且无法真正决定,所以任何想法都受到高度赞赏。

我将使用 OpenSSL/C++。

0 投票
7 回答
461097 浏览

encryption - 如何选择AES加密模式(CBC ECB CTR OCB CFB)?

在哪些情况下首选它们中的哪一个?

我想查看各种模式的评估标准列表,并可能讨论每个标准的适用性。

例如,我认为标准之一是加密和解密的“代码大小”,这对于微代码嵌入式系统很重要,例如 802.11 网络适配器。如果实现 CBC 所需的代码比 CTR 所需的代码小得多(我不知道这是不是真的,这只是一个例子),那么我可以理解为什么使用更小的代码的模式会更受欢迎。但是,如果我正在编写一个在服务器上运行的应用程序,并且我使用的 AES 库无论如何都实现了 CBC 和 CTR,那么这个标准就无关紧要了。

看看我所说的“评估标准列表和每个标准的适用性”是什么意思??

这与编程无关,但与算法有关。

0 投票
4 回答
2429 浏览

.net - 我可以利用 GPU 从 .NET 进行 AES 加密吗?如果是这样,怎么做?

来自都柏林三一学院的有趣论文:
AES Encryption Implementation and Analysis on Commodity Graphics Processing Units

他们的技术使用 openGL 让 GPU 进行 AES 所需的数字转换。

通过托管的 .NET 库公开此功能(执行流加密)有多难?

我将如何开始?提示?例子?

编辑:有人有使用 CUDA 或 Accelerator 的经验吗?

0 投票
2 回答
21865 浏览

java - Java cipher.doFinal() 写入额外字节

我正在使用 Java Cipher 和 AES 实现加密/解密。除了在调用 doFinal() 时写入了 5 个额外字节之外,一切都运行良好。所以,我最终得到一个正确解码的字符串,附加了 5 个额外的字节。

我相信原因是正在写入整个 16 字节块。我看到写入了 3 个 16 字节块,包括最后一个。输入加密文件为 64 字节。未加密的文本应为 43 个字节。

doFinal 的文档表明它可以返回写入输出缓冲区的字节数。但是,它是 0,16,16,16。我已经尝试了各种形式的 doFinal 和更新,但行为没有改变。

它写出一个完整的块是有道理的,因为这就是大多数算法的运作方式。但是,如果它不会告诉我输出数据的大小,我应该如何防止多余的数据?

也许我应该使用另一种算法?AES256 是一项要求,但我想知道不同的块类型或填充类型是否可能允许它写入正确的字节数。

有什么指导吗?

为(一些)简洁而剪裁:

解密例程的业务部分。

0 投票
1 回答
8235 浏览

.net - 我什么时候会选择 AesCryptoServiceProvider 而不是 AesManaged 或 RijndaelManaged?

我认为区别因素是

  • AesCryptoServiceProvider 符合 FIPS
  • AesManaged 是跨平台的,需要 .NET 3.0
  • RijndaelManaged 在 .NET 2.0 上运行,需要限制块大小

是这样吗?