需要一个 RSA 的工作 Perl 示例来加密由 Java 11 使用 java.security 解密的短文本 [关闭]

问题描述 投票:0回答:0

我有一个非常具体的问题,试图加密一个字符串以验证使用 Perl 的 Java 11 的 Web 服务。

我得到了一个公钥,并被告知 Java 11 配置是

Cipher.getInstance("RSA/ECB/PKCS1Padding")

我有一个示例消息和密文的十六进制输出以及一个公钥。使用 Crypto::PK::RSA 加密已知的明文我一直无法匹配 Java 的输出。

我已经测试了 Perl 模块并且已经能够成功地加密和解密随机字符串,所以我相信 Perl 模块对于 RSA 工作正常,所以问题出在其中一个算法中。

Crypto::PK::RSA 使用 PKCS1 1.5,而 Java 代码使用 2.2:

https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html

PKCS #1 v2.2 中描述的填充方案,与 RSA 算法一起使用。

问:任何人都有使用任何可用的 CPAN 模块使用 Crypto::PK:RSA(或任何 CPAN 模块)使用 RSA 加密与 Java 11 java.security 交换密文的 Perl 代码的工作示例?

CryptX模块使用LibTomCrypthttps://www.libtom.net/LibTomCrypt/;如果有人有使用 Java-11 进行这项工作的经验,我可以将其工作到 Inline::C 中并以这种方式处理它。

尝试 C::P::RSA 中的可用选项我没有成功(oeap 不太可能工作但值得尝试,H* 和 h* 解释了十六进制字符串时字节顺序的差异):

# Non-matchnig: H*, v1.5
# Non-matchnig: h*, v1.5
# Non-matchnig: H*, oaep
# Non-matchnig: h*, oaep
# Non-matchnig: H*, oaep SHA1
# Non-matchnig: h*, oaep SHA1
# Non-matchnig: H*, oaep SHA256
# Non-matchnig: h*, oaep SHA256
# Non-matchnig: H*, oaep SHA512
# Non-matchnig: h*, oaep SHA512

谢谢


# this works using openssh-generated keys or ones generated by Crypt::PK:RSA 
# I cannot release the public key or test strings as examples, however. 

package RSA::Testy;
use v5.34;
use FindBin::libs;
use FindBin::libs qw( base=config export=config_d scalar );

use Test::More;
use Crypt::PK::RSA;

chomp( my $input    =    qx{cat $config_d/java.input} );
chomp( my $expect   = uc qx{cat $config_d/java.hex}   ); 

my $madness = 'Crypt::PK::RSA';
my $method  = 'encrypt';

SKIP:
{
    use_ok $madness
    or skip "'$madness' is useless", 1;

    can_ok $madness, $method
    or skip "No '$method' in your $madness", 1;

    my $pub
    = eval
    {
        $madness->new( '$config_d/java-key.pub' );
    }
    or skip "Failed creating pub: $@";

    my $test_encrypt
    = sub
    {
        # close over $pub, $input, $expect.

        my $cipher  = $pub->encrypt( $input, @_ );

        for my $pack ( qw( H* h* ) )
        {
            my $found   = uc unpack "$pack*" => $cipher;

            $found eq $expect
            and return 1;

            diag "Non-matchnig: $pack, @$_";
        }
    };

    for
    (
        [ qw( v1.5          ) ]
      , [ qw( oaep          ) ]
      , [ qw( oaep SHA1     ) ]
      , [ qw( oaep SHA256   ) ]
      , [ qw( oaep SHA512   ) ]
    )
    {
        eval
        {
            $test_encrypt->( @$_ )
        }
        and do
        {
            diag "Matching with pad:\n", explain $_;
            pass 'Matching arguments.';
        };

        diag "Failed test:\n$@" if $@;
    }
};

done_testing
__END__
java perl java-11 public-key-encryption java.security
© www.soinside.com 2019 - 2024. All rights reserved.