我正在尝试从表单中获取密码,在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中加密,它会以正确的方式出现,所以如果有更好的方法来解决这个问题(切换二进制字符串的字节序?)我会更喜欢这样。
我试图用字符串替换字符串,但这只会给我带来胡言乱语。并且万一被问到,解密消息的字符串连接不起作用,因为消息当前在一个64字节的块中。
答案 0 :(得分:1)
您是否有令人信服的理由不使用像sha256这样的简单散列算法通过TLS(SSL)加密整个会话,而不是尝试在此级别上执行与RSA过于复杂的操作?
另外,我对Javascript只有熟悉,但我很确定它会返回十六进制值,而不是小数。你绝对确定它是小数吗?