【问题标题】:RSA decryption coming out backwards, Javascript -> perlRSA 解密倒退,Javascript -> perl
【发布时间】: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


【解决方案1】:

您是否有令人信服的理由不只使用简单的散列算法(如 sha256)通过 TLS (SSL) 加密整个会话,而不是尝试在这个级别使用 RSA 做一些过于复杂的事情?

另外,我对 Javascript 只略知一二,但我很确定它返回的是十六进制值,而不是十进制值。你确定是十进制吗?

【讨论】:

  • 在正常情况下,你是对的,最好只对密码进行哈希处理并提交它而不进行解密,但我必须将它与只接受明文的 LDAP 系统配对密码。
  • var text = key.radix == 16 ? biToHex(crypt) : biToString(crypt, key.radix); Source vs. var text = key.radix == 16 ? biToDecimal(crypt) : biToString(crypt, key.radix); 我的很有趣!我的 RSA 库与源冲突。如您所见,它应该以十六进制输出,但代码调用 binToDecimal。我检查了作者页面上的来源,但事实并非如此。我会尝试更新我的源代码,看看是否有任何变化
猜你喜欢
  • 2021-04-14
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2010-10-11
  • 2012-09-16
  • 2015-03-16
相关资源
最近更新 更多