解决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非对称加密不同系统加密结果不一致的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 非对称加密算法RSA实现详解

    现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单. 初始化密钥: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.g

  • java 中DH的方式实现非对称加密的实例

    java 中DH的方式实现非对称加密的实例 实现代码: package com.sahadev; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.X509Enco

  • java 中RSA的方式实现非对称加密的实例

    java 中RSA的方式实现非对称加密的实例 RSA通俗理解: 你只要去想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密:同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证. 实现代码: package com.sahadev; import java.security.KeyFactory; import java.security.KeyPair; import java.se

  • Java编程实现非对称加密的方法详解

    本文实例讲述了Java编程实现非对称加密的方法.分享给大家供大家参考,具体如下: 对称加密算法在加密和解密时使用的是同一个秘钥:而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥). 是一种 高级的双保险加密方式,一般的实现加密方式有DH密钥交换算法,RSA基于因子分解算法,ElGamal离散对数算法及ECC椭圆曲线加密等. DH加密解密 /** * 非对称加密之:DH加密 * 非对称DH,是安全性基于

  • java结合keytool如何实现非对称加密与解密详解

    前言 参考:java结合keytool实现非对称签名与验证 那一篇讲签名,这一篇将加密解密.在java安全体系中,签名属于JAAS模块,加解密属于JCE模块. keytool的使用 keytool是JDK自带的一个密钥库管理工具.这里只用到了keytool的部分功能,包括生成密钥对,导出公钥等.keytool生成的公钥/私钥对存放到一个到了一个文件中,这个文件有密码保护,通称为keystore. 生成密钥对 $ keytool -genkey -alias signLegal -keystore

  • java 非对称加密算法DH实现详解

    非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥.下面就一起来学习一下吧: 初始化发送方密钥: KeyPairGenerator sendKeyPairGenerator = KeyPairGenerator.getInstance("DH"); sendKeyPairGenerator.initialize(512); KeyPair sendKeyPair

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

    最近在做一个项目,需要用到非对称加密,但是出现一个很诡异的情况,本地开发环境是Windows环境,测试环境是Linux环境,出现一个问题, 那就是本地环境与开发环境同一个私钥字符串加密加密同一个信息,得到的加密结果不一样. 经过查询网络得知,这是由于填充的规则不同导致. 原来的加密的部分代码 byte[] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedK

  • 解决对接JAVA SM2加密遇到的坑

    遇到有接口需要使用国密的SM2算法,对方使用的是JAVA,我们使用的是go,原以为都是标准算法不会有什么大问题,结果巨坑无法.. 对方使用的加密模块,SM2.java和SM2KeyPairs.java,不知道最初是谁开发的,网上貌似很多都是这个版本的实现,但是和go的交互总是有问题,用这个java模块加密的,go里面怎么也无法正确解密.仔细核对之后发现,这个java模块有几个地方并不符合GB/T32891的标准. SM2加密的流程 SM2使用的椭圆曲线基点记为G,私钥为整数d, 公钥为P = d

  • 解决java web应用线上系统偶发宕机的情况

    前言: 事情是酱紫的,系统上线两个月后,风平浪静.在一个秋天宁静的下午,老衲正喝着茶听着歌敲着代码,顺便欣赏下妹纸,独享这难得的惬意.突然手机响了,一看来电,心中一沉,项目经理来电,必有蹊跷.匆忙接起电话,没有问候,直奔主题,"赶紧看下系统,个别客户反馈系统不能用了,先恢复系统,再排查问题". 老衲撂下电话,一哆嗦,赶紧连上VPN,直奔服务器主机. PS:三台服务器(centos.128G内存.32核CPU),tomcat1.7,jdk1.8,通过F5负载 解决步骤: 1.top命令查

  • 解决docker中mysql时间与系统时间不一致问题

    最近在Docker中装mysql时,发现数据库时间与系统时间相差8个小时. linux服务器时间: 进入mysql,输入date如下 发现两者时区不同.因为mysql容器是在docker中安装的,所以mysql的时间不对应该是宿主docker导致的. 查询资料发现,docker的默认时区是0区,其实这会对安装的容器造成不少麻烦,比如执行日志的记录不准确等. 有如下两种方式解决: 方法一:复制主机的localtime docker cp /etc/localtime [容器ID或者NAME]:/e

  • 浅析Node.js非对称加密方法

    前言 刚回答了SegmentFault上一个兄弟提的问题<非对称解密出错>.这个属于Node.js在安全上的应用,遇到同样问题的人应该不少,基于回答的问题,这里简单总结下. 非对称加密的理论知识,可以参考笔者前面的文章<NODEJS进阶:CRYPTO模块之理论篇>. 完整的代码可以在 <Nodejs学习笔记> 找到,也欢迎大家关注 程序猿小卡的GitHub. 加密.解密方法 在Node.js中,负责安全的模块是crypto.非对称加密中,公钥加密,私钥解密,加解密对应的

  • Java spring单点登录系统

    目录 1.单点登录系统介绍 2.简单业务实现 2.1添加依赖 2.2 项目配置文件 2.3添加项目启动类 2.4 启动并访问项目 3. 优化进一步设计 3.1 定义安全配置类 SecurityConfig 3.2定义用户信息处理对象 3.3 网关中登陆路由配置 3.4基于Postman进行访问测试 3.5 定义登陆页面 3.6 构建令牌配置对象 3.7 定义认证授权核心配置 授权服务器的核心配置 Postman访问测试 4 资源服务器配置–sca-resource 4.1 构建令牌配置对象 4.

  • 快速解决iOS10不能跳转系统WiFi列表的问题

    第一种方式: 在iOS10更新后,系统设置跳转被禁用,只能跳转App设置,但是最近发现苹果又更新了URLscheme,亲测可用,建议iOS10已下,还用原来的scheme #define iOS10 ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0) NSString * urlString = @"App-Prefs:root=WIFI"; if ([[UIApplication sharedApplic

随机推荐