使用 AES CBC 在 perl 中正确格式化初始化向量
proper formatting of initialization vectors in perl using AES CBC
我正在尝试在 perl 中解密在 java 中使用 AES/CBC 加密的字符串。我苦苦挣扎的是,加密输出似乎没有将初始化向量作为输出的前 16 个字节。为了验证我的解密算法是否按预期工作的概念证明,我想在我的 perl 脚本中对初始化向量进行硬编码。
我正在使用 Crypt::CBC,但是当将初始化向量传递给这个库时,我不确定它需要什么样的格式。我试过简单地将初始化向量作为字符串传递,例如
$my iv = "0000000000000000";
但它似乎不起作用,因为使用此初始化向量解密不会产生任何输出。
所以我的问题是,如果在 java 中按如下方式创建初始化向量:
byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
如何在 perl 中复制这个初始化向量?
也许下面的东西可以满足您的要求
use strict;
use warnings;
use feature 'say';
my $vec;
$vec .= chr(rand(255)) for 1..16;
say '0x' . unpack('H*', $vec);
Java IV 的等价物是
my $iv = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\x01\x02\x03\x04\x05\x06";
和
my $iv = pack("C*", 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6);
请注意,您不应使用常量 IV。这与重点背道而驰,导致安全性遭到破坏。您应该使用完全随机的字节,并且它们对于您编码的每个 message/stream 都应该不同。现在,听起来你这样做只是为了测试,在这种情况下你可以忘记我说了什么:)
我正在尝试在 perl 中解密在 java 中使用 AES/CBC 加密的字符串。我苦苦挣扎的是,加密输出似乎没有将初始化向量作为输出的前 16 个字节。为了验证我的解密算法是否按预期工作的概念证明,我想在我的 perl 脚本中对初始化向量进行硬编码。
我正在使用 Crypt::CBC,但是当将初始化向量传递给这个库时,我不确定它需要什么样的格式。我试过简单地将初始化向量作为字符串传递,例如
$my iv = "0000000000000000";
但它似乎不起作用,因为使用此初始化向量解密不会产生任何输出。
所以我的问题是,如果在 java 中按如下方式创建初始化向量:
byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
如何在 perl 中复制这个初始化向量?
也许下面的东西可以满足您的要求
use strict;
use warnings;
use feature 'say';
my $vec;
$vec .= chr(rand(255)) for 1..16;
say '0x' . unpack('H*', $vec);
Java IV 的等价物是
my $iv = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\x01\x02\x03\x04\x05\x06";
和
my $iv = pack("C*", 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6);
请注意,您不应使用常量 IV。这与重点背道而驰,导致安全性遭到破坏。您应该使用完全随机的字节,并且它们对于您编码的每个 message/stream 都应该不同。现在,听起来你这样做只是为了测试,在这种情况下你可以忘记我说了什么:)