问题标签 [block-cipher]
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.
encryption - AES 128 解密,密文比密钥短
我们正在开发一个应用程序,该应用程序必须处理由 LoraWan ( https://www.lora-alliance.org )加密的数据
我们已经找到了他们如何加密数据的文档,并且在过去的几天里一直在阅读它(https://www.lora-alliance.org/sites/default/files/2018-04/lorawatm_specification_-v1 .1.pdf ) 但目前仍然无法解决我们的问题。
我们必须使用带有零填充的 AES 128 位 ECB 解密来解密消息,但问题是它不起作用,因为我们收到的加密消息对于 AES 128 来说不够长,因此算法返回“数据不是完成块”的最后一行异常。
我们收到的一个示例密钥是这样的:D6740C0B8417FF1295D878B130784BC5(不是真正的密钥)。它是 32 个字符长,因此是 32 个字节,但如果将其视为十六进制,则它变为 16 个字节长,这是 AES 128 位所需要的。这是我们用来从字符串转换十六进制的代码:
(上面代码需要注意的一点是,我们不确定要使用什么编码,因为我们在 Lora 文档中找不到它并且他们没有告诉我们,但是根据这个小设置,我们可能会搞砸我们的解密(尽管我们已经尝试了所有可能的组合,ascii、utf8、utf7 等))
我们收到的示例消息是:d3 73 4c,我们假设它也是十六进制的。这只有 6 个字节,如果我们将其从十六进制转换为普通字节,则需要 3 个字节,而我们需要最少的 16 个字节来匹配密钥长度。
这是我们正在使用的 Aes 128 解密代码:
所以很明显这将在 sr.ReadToEnd() 处返回“数据是一个不完整的块”。
正如您从示例中看到的那样,在注释掉的行中,我们还尝试使用正确长度的完整零字节数组(16 - cipherText)将文本“填充”到正确的大小,在这种情况下,算法运行很好,但它返回完整的乱码,而不是原始文本。
我们已经尝试了所有的操作模式,并且也使用了填充模式。除了密文和该文本的密钥,他们没有为我们提供任何东西。也没有初始化向量,所以我们假设我们应该每次都生成它(但对于 ECB,它甚至不需要 iirc)
更重要的是,他们能够很好地加密-解密他们的消息。最令人费解的是,我已经用谷歌搜索了好几天了,我在 google 上找不到一个 SINGLE 示例,其中 CIPHERTEXT 在解密期间比密钥短。
显然,我发现了他们正在加密的消息比所需消息短的示例,但这就是加密端的填充(对吗?)。这样当您收到填充消息时,您可以告诉算法使用什么填充模式使其长度正确,这样它就可以将填充与消息分开。但在所有这些情况下,解密期间收到的消息的长度都是正确的。
所以问题是——我们做错了什么?有没有办法用比密钥短的密文解密?还是他们通过生成太短的密码而在某个地方搞砸了?
谢谢你的帮助。
encryption - 在 DES 算法中使用 CTR 模式(在 python 中)
我想通过使用 PyCryptodome 包在 python 中的 DES 算法中使用 CTR 模式。我的代码出现在这篇文章的末尾。但是我收到了这个错误:“TypeError:不可能为短块大小创建一个安全的随机数”。值得一提的是,此代码适用于 AES 算法,但不适用于 DES、DES3、Blowfish 等(64 块大小)。据我所知,CTR 模式可以应用于 64 块密码算法。
非常感谢。
java - Java 密码在加密数据方面的可靠性如何?
我正在尝试学习 Java Cipher Crypto,但对下面的代码有一些疑问:
为什么
keyBitSize
设置为 256 时会出现 Invalid Key Exception (invalid key size)?密码是否限制为 128 位?此加密方法是否始终生成一致的加密字符串长度 11(设置为 时
keyBitSize = 128
)?此方法是否会截断任何长度更长的纯文本输入字符串?
在将加密值存储到 MySQL 数据库之前使用这种方法加密用户输入是否是一种可靠的安全形式?
java - 如何控制加密字符串的长度(密码学 - 加密)
例如,我想传入一个字符串“abc”,然后输出加密字符串应该是 32 字节,当我想传递“abcdef”时,输出也应该是 32 字节。换句话说,我想要固定长度的加密输出。我知道我的上限。就像我知道我的字符串永远不会超过 8 个字符。最多 8 个字符或少于 8 个字符。它永远不会超过 8 个。
如果有人在 java Cipher 中共享代码,那就太好了。
encryption - AES 密钥长度和块长度
我已经读到密钥长度和 AES 中的块长度之间没有相关性。但这对我来说没有意义,因为密钥将对块进行异或,它们如何具有不同的长度?
java - 为什么在一个 Java 类中加密而在另一个类中解密会导致 BadPaddingError?
我有一个测试函数,它在一个 Java 类中返回一个 byte[] FirstClass
,:
WhereCipherClass
包含我java.crypto.Cipher
加密和解密输入的方法。
在另一个 Java 类中SecondClass
,我实例化了我的前一个FirstClass
并调用它的 testA() 方法,我将它保存到一个byte[]
变量中,然后尝试解密它:
为什么在一个 Java 文件中加密一个字符串,然后将生成的 byte[] 传递到另一个 Java 文件来解密它会导致 BadPaddingError?
可以做些什么来解决这个问题?
为什么密码只有在加密和解密都在同一个类中时才起作用,如下所示?:
编辑: 我的CipherClass
代码如下要求。
SecretKey
和IVParameterSpec
发电机:
我的encrypt()
方法:
我的decrypt()
方法:
ssl - 在 TLS 密码套件中哪里可以找到分组密码模式
我正在通过在 C# 程序中使用 System.Net Trace Listener 来找出在 TLS 连接上使用的 TLS 密码套件。我在跟踪日志文件中获得以下详细信息:
查看密码套件的解剖结构,从上面的跟踪文件数据中,除了“分组密码模式”之外,我有以下组成密码套件的所有组件:
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
我在哪里或如何找到上面的值“GCM”。一些分组密码模式是 GCM、CBC、CCM。
c# - 如何在 Bouncy Castle 和 C# 中使用 Aria 加密算法
根据this和this page,Bouncy Castle库包含Aria Cipher算法的实现。但我找不到任何关于如何在 C# 和库中使用此算法的文档?
有人可以帮助我并描述如何使用该库来实现算法吗?
先感谢您