首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BadPaddingException:数据必须从零开始--为什么?

BadPaddingException:数据必须从零开始--为什么?
EN

Stack Overflow用户
提问于 2014-03-14 07:11:34
回答 2查看 1.7K关注 0票数 0

我需要编写一个java代码,它使用客户提供的私钥/公钥加密/解密消息。以下是我所做的:

  • 我从客户那里得到了PKCS#1格式的私钥(首先是--开始是RSA私钥-)
  • 我使用以下命令将其转换为PKCS#8: openssl pkcs8 -topk8 -nocrypt -in private_pkcs1.key -out private_pkcs8.key
  • 现在我有了PKCS#8格式的私钥(开头是
  • 我已经使用以下命令从私钥中提取了公钥(两种格式都尝试过,并且获得了相同的公钥): openssl rsa -in private_pkcs8.key -pubout > public.key
  • 我编写了以下方法来读取private_pkcs8.key文件的私钥: 私有静态PrivateKey readPrivateKey(String filename)抛出IOException、NoSuchAlgorithmException、InvalidKeySpecException {InvalidKeySpecException{filename=新文件(文件名);FileInputStream in =新FileInputStream(文件);byte[] keyBytes =新字节新长(file.length()).intValue();in.read(keyBytes);in.close();String strPrivateKey =新字符串(keyBytes,“utf-8”).replaceAll(“keyBytes私钥-+\r?\n-++\r?\n?”);PKCS8EncodedKeySpec(DatatypeConverter.parseBase64Binary(strPrivateKey));keySpec =新的keySpec KeyFactory keyFactory = KeyFactory.getInstance("RSA");返回keyFactory.generatePrivate(keySpec);}
  • 我编写了以下方法从public.key文件中读取公钥 私有静态PublicKey readPublicKey(String filename)抛出NoSuchAlgorithmException、InvalidKeySpecException、IOException {IOException{filename=新文件(文件名);FileInputStream in =新FileInputStream(文件);byte[] keyBytes =新字节新长(file.length()).intValue();in.read(keyBytes);in.close();String strPublicKey =新字符串(keyBytes,“utf-8”).replaceAll(“keyBytes公共密钥-+\r?\n++\r?\n?”);X509EncodedKeySpec(DatatypeConverter.parseBase64Binary(strPublicKey));keySpec =新的keySpec KeyFactory keyFactory = KeyFactory.getInstance("RSA");返回keyFactory.generatePublic(keySpec);}
  • 我编写了以下加密方法 私有静态byte[]加密(byte[]消息、密钥)抛出NoSuchAlgorithmException、NoSuchPaddingException、InvalidKeyException、IllegalBlockSizeException、BadPaddingException、NoSuchProviderException、InvalidAlgorithmParameterException {密码= Cipher.getInstance(ALGORITHEM);cipher.init(Cipher.ENCRYPT_MODE,key);返回cipher.doFinal(消息)};
  • 我已经编写了以下解密方法 私有静态byte[]解密(byte[] message,key)抛出NoSuchAlgorithmException、NoSuchPaddingException、InvalidKeyException、IllegalBlockSizeException、BadPaddingException、NoSuchProviderException、InvalidAlgorithmParameterException {密码= Cipher.getInstance(ALGORITHEM);cipher.init(Cipher.DECRYPT_MODE,key);返回cipher.doFinal(消息)};
  • 我编写了以下主要测试应用程序,它试图加密一个简单的字符串并将其解密回来。 公共静态空主(String[] args)抛出NoSuchAlgorithmException、InvalidKeySpecException、IOException、InvalidKeyException、NoSuchPaddingException、IllegalBlockSizeException、BadPaddingException、SignatureException、NoSuchProviderException、InvalidAlgorithmParameterException { readKeys();string messageToEncrypt =“这是我想测试的字符串”;日志(“原始消息:+messageToEncrypt”);byte[] originalBytes = messageToEncrypt.getBytes("UTF-8");messageToEncrypt=加密(,#en25 20);=解密(,);日志(“解除消息:”+新字符串());
  • 加密是正常的,但是当我试图将它解密回原始消息时,我得到了以下异常: 线程"main“javax.crypto.BadPaddingException中的异常:数据必须在sun.security.rsa.RSAPadding.unpadV15(未知源)在sun.security.rsa.RSAPadding.unpad(未知源)在sun.security.rsa.RSAPadding.unpad(未知源)处以零开始在com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)在javax.crypto.Cipher.doFinal(DashoA13 13*.)在com.company.encryption.utils.RsaUtils.decrypt(RsaUtils.java:95) at com.company.encryption.utils.RsaUtils.main(RsaUtils.java:108)错误: JDWP无法获得JNI 1.2环境时,jvm->GetEnv()返回代码= -2 JDWP退出错误AGENT_ERROR_NO_JNI_ENV(183):../src/共享/back/util.c:820

请注意,JVM也会崩溃,这非常奇怪。

  • 当我替换了私钥/公钥,转而使用KeyPairGenerator时,一切正常。这使我得出这样的结论:密钥有问题,或者我读取密钥的方式,或者我用来加密/解密的算法。(我试过"RSA“、”RSA/ECB/PKCS1Padd“-没有运气)

我在这个问题上花了两天多的时间。我确保使用相同的公钥/私钥,没有尝试将byte[]转换为String。我“按书”做了所有的事

如能在此问题上提供任何帮助,我们将不胜感激。有什么问题我可以问我的客户关于钥匙,这将帮助我解决这个谜?为什么JVM也会崩溃?

谢谢盖伊·胡达拉

EN

回答 2

Stack Overflow用户

发布于 2014-03-14 21:05:02

在非对称密码中,一个用公钥加密,一个用私钥解密。这样可以确保任何人都可以用众所周知的公钥对消息进行加密,但只有私钥的持有者才能解密它。

代码语言:javascript
复制
byte[] encryptedBytes = encrypt(originalBytes, publicKey);
byte[] decryptedBytes = decrypt(encryptedBytes, privateKey);
票数 0
EN

Stack Overflow用户

发布于 2018-01-30 07:09:39

我也有同样的问题。通过重新生成公钥来解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22398384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档