我正在尝试对java中的AES数据进行编码,通过网络发送数据并以ruby对其进行解码。
基本字符串可以正常工作,但是一旦字符串的长度为16个字节或更多,我在解码后的红宝石字符串的编码中就会产生垃圾。我猜想它与填充有关(虽然不确定,因为它甚至影响精确大小为16的字符串)
我尝试使用PKCS或只是在字符串的末尾添加空格以匹配确切的长度而没有运气
还可以有人解释为什么我必须在红宝石中执行“ aes-256-cbc”,因为我知道我的Java代码使用aes
128吗?在Ruby中尝试AES-128-CBC对任何字符串都不起作用
任何帮助是极大的赞赏
这是我的基本代码
爪哇
byte[] raw = key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(str.getBytes());
return new BASE64Encoder().encode(encrypted);
红宝石
def aes_decrypt(key, encrypted)
decipher =OpenSSL::Cipher::Cipher.new("aes-256-cbc")
decipher.decrypt
decipher.padding = 0
decipher.key = key
d = decipher.update(encrypted)
d << decipher.final
logger.debug "email #{d.to_s}"
return d.to_s
end
有 填充 ,有 链接 。您应该首先获得正确的链接。
AES加密16字节的块,不多也不少。当您想加密一条可能超过16个字节的消息时,则必须决定如何将数据拆分为块并随后重新组合。基本拆分算法称为 ECB
:这是“拆分”为单独加密的块。已知ECB在实际数据方面的能力很弱,因为ECB会泄漏有关哪些明文块彼此相等的信息(它们将被相同地加密),并且这种冗余经常发生在“正常”数据中。
因此,需要以某种方式“随机化”数据块,以便隐藏数据冗余。该 CBC
模式执行通过“链”:一个块的处理取决于前一个块的加密的结果。即,将要加密的明文块与前一个块加密的输出组合(按位XOR)。
这里的重点是,要加密的第一个块(数据的前16个字节)没有“上一个块”,因此无需进行XOR处理。这可以通过选择“随机IV”(即16个随机字节的序列)来解决,该序列将用作XORing步骤的“块-1”。解密方必须知道IV(否则它将不知道对解密的块执行XOR运算,并且前16个字节的数据将无法理解)。好的一面是,静脉注射不需要保密。必须对其进行统一选择(不能为每个消息递增计数器),但通常可以沿加密消息本身“明文”发送。
因此,您不必担心IV,在Java或Ruby代码中我什么都看不到。通常,Java默认为ECB(因此完全没有IV)。如果Ruby在CBC中默认为“全零IV”(从概念上来说是不安全的),那么可以解密第一个块(将其写下来,它“可以正常工作”)是正常的,但同样正常它不适用于后续块。
因此,我建议您显式地使用CBC(在Java中,"AES/CBC/PKCS5Padding"
用作算法名称,而不是"AES"
)并管理IV(必须将其传输;可以采用约定在加密消息之前连接IV)。
其他一些注意事项:
填充 是将一些数据添加到纯文本中,以便您具有适当的输入长度。CBC要求输入长度的长度必须是块大小(16个字节)的倍数。PKCS#5填充是一种流行的方法,通过该填充,您可以添加至少1个字节,最多16个字节,从而使它们全部具有值 n ,其中 n 是添加的字节数。然后,接收方可以(明确地)知道添加了多少个字节,并将其删除。Java可以为您添加填充,并且我想Ruby也可以根据需要自动处理填充。
在Java代码中,使用key.getBytes()
。我想那key
是一个String
。知道会getBytes()
根据平台默认字符集对字符串进行编码,但在全球范围内并不总是相同。通过指定显式字符集,您将省去一些麻烦。另外,由于您想使用128位密钥,但是在Ruby端只能通过“ AES-256”获得某些东西,因此我假设您实际上在Java端使用了256位密钥。我的猜测是您的key
字符串是密钥的 十六进制 表示形式,为32个字符。key.getBytes()
不解释十六进制数字;它对字符本身进行编码,产生一个32字节的数组-和32字节,即256位,而不是128位。
在我的docker服务器上,我在sidekiq/redis URL-URL-Sespecification上出错: 我明白了 URI::InvalidURIError:方案redis不接受注册表部分:bsc\u redis:6379(或错误的主机名?)来自/usr/local/lib/ruby/2.0.0/uri/generic。rb:214:innew'from/usr/local/lib/ru
对于一个电子商务应用程序,我试图将选项的散列(每个选项都有一个选择数组)转换为表示这些选择组合的散列数组。例如: 输入内部可能有其他选项,每个选项的选项数量不确定,但它只会嵌套 1 级深。任何
我正在使用Ruby和Selenium web驱动程序测试一个webapp。我无法检查显示网页中单元格的内容。我想要的是td中的IP。 我使用Firefox插件firepath获取IP的Xpath。它给出了“html/body/div[1]/div[2]/div[3]/form/table/tbody/tr[1]/td[6]/ul/li”,看起来是正确的。 但是我无法显示IP。这是我的测试代码; 把
我想更新个人资料(accounts.google.com)中的工作、教育、基本信息和联系信息 我有文件“Testcases.feature” 场景:用户可以更新工作信息 我无法单击“编辑”按钮,因为网站中存在许多“编辑”按钮 当我运行cmd时: 中,我单击“编辑”按钮'
我正在使用来存储一些计算机模拟的结果。不幸的是,当文件变得太大(从我所看到的超过2GB)时,我无法再将文件写入磁盘,我收到以下错误; 我知道这可能是的限制,但我想知道是否有解决方法。例如,要读取大型 JSON 文件,我会先文件,然后分批读取。也许最终的解决方案应该是在后端切换到一个合适的数据库,但是由于特定Ruby(Sketchup)的一些限制,我使用这个并不总是可能的。
有人知道为什么IntelliJ Idea Ultimate不喜欢更新语法中的Ruby哈希文本吗?请参阅下面IDE屏幕截图中的红色下划线。语法: 真的很烦人,因为这意味着我的整个项目在目录树上都有一条红色下划线。 我在IDE首选项中设置了一个大于1.9的Ruby SDK版本(我认为是在这个时候引入了新的哈希文本语法),所以没有任何借口! 谢谢