当前位置: 首页 > 编程笔记 >

解决JAVA非对称加密不同系统加密结果不一致的问题

蔺宇
2023-03-14
本文向大家介绍解决JAVA非对称加密不同系统加密结果不一致的问题,包括了解决JAVA非对称加密不同系统加密结果不一致的问题的使用技巧和注意事项,需要的朋友参考一下

最近在做一个项目,需要用到非对称加密,但是出现一个很诡异的情况,本地开发环境是Windows环境,测试环境是Linux环境,出现一个问题, 那就是本地环境与开发环境同一个私钥字符串加密加密同一个信息,得到的加密结果不一样。

经过查询网络得知,这是由于填充的规则不同导致。

原来的加密的部分代码

byte[] keyBytes = Base64.decodeBase64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec) ;    
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateK);

修改后的加密的部分代码

byte[] keyBytes = Base64.decodeBase64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
//  Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, privateK);

因此差异部分就是Cipher cipher的获取存在差异导致不同系统下同一秘钥,同一信息加密结果不一致

补充知识:Java RSA3加密时因编码不同导致结果不同

最近遇到一个问题,使用RSA3加密及验证时候,因为我方与客户方工程的编码格式不同,导致我方使用私钥加密后,客户使用公钥解密失败。

最后问题定位到src.getBytes()代码,因我方工程使用GBK编码,src.getBytes()执行时获取默认编码为GBK(即src.getBytes("GBK")),而客户方工程使用UTF-8编码,解密执行src.getBytes()时获取默认编码为UTF-8(即src.getBytes("UTF-8"))。造成解密校验失败。

解决方法:加密时设置UTF-8编码格式—src.getBytes("UTF-8",如下:

测试(file的默认编码为GBK):

以上这篇解决JAVA非对称加密不同系统加密结果不一致的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 主要内容:1.对称加密,2.非对称加密,3.混合加密,4.常见的摘要算法1.对称加密 AES,密钥长度有128/256/192。高级加密标准,是下一代的加密算法标准,速度快,安全级别高; DES:密钥为56, 数据加密标准,速度较快,适用于加密大量数据的场合。 3DES: 密钥为168.是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 IDES: 密钥为128 SM1: 密钥为128 SM4: 密钥为128 RC4, RC5, RC6 DESX 两边用

  • 本文向大家介绍Android对称加密与非对称加密,包括了Android对称加密与非对称加密的使用技巧和注意事项,需要的朋友参考一下 凯撒密码 1. 介绍 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3 的时候,所有的字母

  • 问题内容: PHP功能: Java函数 } 返回null。 请注意,我们不允许更改PHP代码。有人可以帮助我们在Java中获得相同的结果吗?非常感谢。 问题答案: 如果您不只是简单地将例程中的可能内容吞噬掉,那么您将对发生的事情有了更好的了解。如果函数正在返回,那么显然发生了异常,您需要知道它是什么。 实际上,例外是: 可以肯定的是,您的纯文本长度只有11个Java字符,按照您的默认编码,它将为1

  • 本文向大家介绍C#对称加密与非对称加密实例,包括了C#对称加密与非对称加密实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#对称加密与非对称加密的原理与实现方法,分享给大家供大家参考。具体分析如下: 一、对称加密(Symmetric Cryptography) 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secr

  • 介绍 对于非对称加密,最常用的就是RSA和DSA,在Hutool中使用AsymmetricCrypto对象来负责加密解密。 非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,我们可以选择使用不同的密钥加密: 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改,但是不用来保证内容不被他人获得。 加密:用公钥加

  • 我有自己的方法。net项目来加密密码 我的任务是将此方法转换为java,但在java中,我没有得到与该方法相同的结果。网络版 我的java代码是 加密“1”的结果是: 而java是 你能帮我解决这个问题吗?

  • 我已经尝试使用cipher.getinstance(“rsa/ecb/pkcs1padding”),但没有给出预期的结果。 感谢所有的帮助。祝你有美好的一天。

  • 我试图创建一个Android应用程序,它可以动态加密数据并将其写入存储。已经实现了没有加密的应用程序,在stackoverflow上查看了100个加密示例/帖子,但无法决定使用哪种方法。 一开始想到使用AES,就在谷歌上搜索它的安全性。每次输入16或32个字符(我希望安全性更好)的密码似乎并不方便。作为一种替代的非对称加密方式,人们想到了。用一个密钥加密,用另一个密钥解密,这样我就可以将用于加密的