原谅我对加密的无知。我正在尝试使用Bouncy Castle的PGP加密。我能够使用与jar一起打包的示例来创建一个很好的工作解决方案(我想)。一切都很好,我能够使用我的公钥加密和我的私钥解密用于测试目的。当我将更改推送到Linux服务器时出现了问题。一旦更改在linux服务器上,我的decript方法就会抛出'org.bouncycastle.openpgp.PGPException:无法创建密码:没有这样的算法:RSA / ECB / PKCS1Padding'
我发现这非常奇怪,因为我在本地没有问题。我开始打印所有的Security.getProviders()及其算法,看看我是否可以确定远程和本地环境之间的区别。果然,我的本地环境有一个“RSA / ECB / PKCS1Padding”条目,而远程环境却没有。经过大量的谷歌搜索后,很明显,提供'RSA / ECB / PKCS1Padding'算法(sunMSCAPI.jar)的JRE jar只是windows,而不是用jre for linux包装,据我所知。 这是我对于充气城堡的pom.xml:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk15on</artifactId>
<version>1.56</version>
</dependency>
服务器Java信息:
java版“1.8.0_60” Java(TM)SE运行时环境(版本1.8.0_60-b27) Java HotSpot(TM)64位服务器VM(内置25.60-b23,混合模式)
Linux版本: 命令:cat /etc/issue.net |头-1 -
Oracle Linux Server 6.8版
另一个重要的注意事项是它只会抛出GPG v2的异常而不是GPG v1.49。我只注意到这一点,因为我获得了集成合作伙伴和公钥的公钥.asc它说'Version:GnuPG v1.4.9(AIX)'
当我在搜索论坛寻找解决方案时,我正在慢慢地陷入疯狂。我真的很想知道为什么'RSA / ECB / PKCS1Padding'在我的linux服务器上不是一个可用的算法,我应该去哪里寻找解决方案。
这里要求的是违规代码的代码片段:
byte[] bytes = compressFile(tempFile.getAbsolutePath(), CompressionAlgorithmTags.ZIP);
PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(
new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5).setWithIntegrityPacket(true)
.setSecureRandom(new SecureRandom()).setProvider("BC"));
encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider("BC"));
OutputStream tempFileOutputStream = new ArmoredOutputStream(new FileOutputStream(tempFile));
// This cOut OutputStream is an instance of WrappedGeneratorStream
// (Bouncy Castle Class)
// The below code is the offending code
OutputStream cOut = encGen.open(tempFileOutputStream, bytes.length);
PGPEncryptedDataGenerator类是BouncyCastle类。