我有一个非常具体的问题,试图加密一个字符串以验证使用 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__