【发布时间】:2011-07-06 21:48:40
【问题描述】:
我正在尝试从表单中获取密码,在 java 脚本中使用 RSA 对其进行加密并提交表单。
当 Perl 代码收到表单时,它将解密密码。我已经能够使用相同的 RSA 密钥获取 java 脚本和 Perl,并且我可以使用 java 脚本解密在 java 脚本中加密的消息,以及使用 Perl 在 Perl 中加密的消息。
下一步是在 java 脚本中加密并在 Perl 中解密。经过很多挫折,我快到了,但是解密的字符串是向后的:
Clear Text Here!
在 Javascript 中加密,然后通过 post 提交 Perl 然后尝试解密并创建以下内容
������������������������������������������������ereh txet raelC
如您所见,它是倒退的。奇怪的字符是 javascript 库用 0 填充字符串的结果。
我怀疑这可能与字节序有关,但到目前为止我为此所做的实验创造了 gobbly-gook。
我正在使用 perl 包 Crypt::OpenSSL::RSA; Dave Shapiro 编写的 javascript rsa 和相关数学库可以在这里找到:http://ohdave.com/rsa/
javascript RSA 库将其值作为二进制的十进制表示形式返回。我将它提供给 Crypt::OpenSSL::Bignum 对象,以将其转换回二进制文件以供 perl 代码使用。
加密代码为:
function doEncryption(key, ptextID, ctextID) {
$(ctextID).val("Encrypting...");
$(ctextID).val(encryptedString(key, $(ptextID).val()));
}
而解密码是:
sub java_decrypt {
my $message = shift;
my $rsa = shift;
$rsa->use_no_padding();
my @blocks = split ' ', $message;
my $decmessage = "";
foreach my $block (@blocks) {
my $bitz = Crypt::OpenSSL::Bignum->new_from_decimal($block);
$decmessage .= $rsa->decrypt($bitz->to_bin());
}
$rsa->use_pkcs1_oaep_padding();
#$decmessage = reverse $decmessage;
#$decmessage =~ s/\0//g;
return($decmessage);
}
最后注释掉的两行将纠正解密向后和填充的问题,但我不知道我是否信任它。如果在 perl 中加密,它会以正确的方式出现,所以如果有更好的方法来解决这个问题(切换二进制字符串的字节顺序?)我更喜欢那个。
我尝试用 pack 交换字节顺序,但这只会让我胡言乱语。并且以防万一,解密消息的字符串连接不会起作用,因为消息当前位于单个 64 字节块中。
【问题讨论】:
-
您这样做是为了达到什么目的?想要密码的攻击者可以简单地修改您发送给客户端的 javascript 以使密码以明文形式发送 - 或截取密钥,以便他们可以读取加密的密码。
-
RSA,我可以只给 javascript 密钥的公共部分,因此如果他们拦截它们,这对他们没有好处,因为他们需要在服务器上安全的私钥。我假设攻击者只能拦截传输。我不确定如何保护用户免受修改后的 javascript 的侵害,但是对客户端计算机的攻击将始终有效,因为您可以在输入密码时将 javascript 设置为密钥日志。否则,您主张始终使用明文密码传输,因为任何形式的保护都是无用的,我不同意。
标签: javascript perl cryptography rsa endianness