`

java rsa 互相加解密

阅读更多

package com.isg.util;

 

import java.io.ByteArrayOutputStream;

import java.security.Key;

import java.security.KeyFactory;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.Base64;

 

import javax.crypto.Cipher;

 

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

 

@SuppressWarnings("restriction")

public abstract class RSAUtil {

 

/**

* RSA

*/

public static final String KEY_ALGORITHM = "RSA";

/**

* RSA/ECB/PKCS1Padding

*/

public static final String RSA_model = "RSA/ECB/PKCS1Padding";

/**

* RSA最大加密明文大小

*/

private static final int MAX_ENCRYPT_BLOCK = 117;

/**

* RSA最大解密密文大小

*/

private static final int MAX_DECRYPT_BLOCK = 128;

 

public static BASE64Decoder dec = new BASE64Decoder();

public static BASE64Encoder enc = new BASE64Encoder();

 

// 私钥解密

public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

// 对数据分段解密

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_DECRYPT_BLOCK;

}

byte[] decryptedData = out.toByteArray();

out.close();

return decryptedData;

}

 

// 私钥解密2

public static String decryptByPrivateKey(String data, String key) throws Exception {

return new String(decryptByPrivateKey(dec.decodeBuffer(data), dec.decodeBuffer(key)), "UTF-8");

}

 

// 公钥解密

public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

 

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.DECRYPT_MODE, publicKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

// 对数据分段解密

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_DECRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_DECRYPT_BLOCK;

}

byte[] decryptedData = out.toByteArray();

out.close();

return decryptedData;

}

 

// 公钥解密2

public static String decryptByPublicKey(String data, String key) throws Exception {

return new String(decryptByPublicKey(dec.decodeBuffer(data), dec.decodeBuffer(key)), "UTF-8");

}

 

// 公钥加密

public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_ENCRYPT_BLOCK;

}

byte[] encryptedData = out.toByteArray();

out.close();

return encryptedData;

}

 

// 公钥加密2

public static String encryptByPublicKey(String data, String key) throws Exception {

byte[] signByte = encryptByPublicKey(data.getBytes("UTF-8"), dec.decodeBuffer(key));

return enc.encode(signByte);

}

 

// 私钥加密

public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());

cipher.init(Cipher.ENCRYPT_MODE, privateKey);

int inputLen = data.length;

ByteArrayOutputStream out = new ByteArrayOutputStream();

int offSet = 0;

byte[] cache;

int i = 0;

while (inputLen - offSet > 0) {

if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {

cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);

} else {

cache = cipher.doFinal(data, offSet, inputLen - offSet);

}

out.write(cache, 0, cache.length);

i++;

offSet = i * MAX_ENCRYPT_BLOCK;

}

byte[] encryptedData = out.toByteArray();

out.close();

return encryptedData;

}

 

// 私钥加密2

public static String encryptByPrivateKey(String data, String key) throws Exception {

BASE64Decoder dec = new BASE64Decoder();

BASE64Encoder enc = new BASE64Encoder();

byte[] signByte = encryptByPrivateKey(data.getBytes("UTF-8"), dec.decodeBuffer(key));

return enc.encode(signByte);

}

 

// 私钥加密 RSA使用 RSA/ECB/PKCS1Padding 组合模式补位。

public static byte[] encryptByPrivateKeyIss(byte[] data, String key) throws Exception {

// 对密钥解密

byte[] keyBytes = Base64.getDecoder().decode(key);

// 取得私钥

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

Key privateKey = keyFactory.generatePrivate(keySpec);

// 对数据加密

Cipher cipher = Cipher.getInstance(RSA_model);

cipher.init(Cipher.ENCRYPT_MODE, privateKey);

return cipher.doFinal(data);

}

 

// 私钥验证公钥密文

public static boolean checkPublicEncrypt(String data, String sign, String pvKey) throws Exception {

return data.equals(decryptByPrivateKey(sign, pvKey));

}

 

public static boolean checkPrivateEncrypt(String data, String sign, String pbKey) throws Exception {

return data.equals(decryptByPublicKey(sign, pbKey));

}

 

// int blockSize = (true == Cipher.ENCRYPT_MODE) ? RsaConst.ENCRYPT_KEYSIZE

// : RsaConst.DECRYPT_KEYSIZE;

 

public static void main(String[] args) {

 

/*String pub = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs76FIXTlWF3YeD5VCuGra1pAvPDqOKjRXGj7h2ZR7svya8uQuT8co4Pt2H7gAudQA4Kp2C82YUn0JpTCyBF2W1FjSgu9RlPJSxNz8+DeQn+4mYhJcd3wR1KrH9gxlv7SY+YudhQdwTfjjmh8KafapND4bYwxXBI3lSjWZqiYlWaVBIbFyHyoSOKN+I9zsJZ2ctEd0V9TRUywmCOq3wVJbR4fOeumLcaqIHyD7KdE5gLH0MXFhnHdInQ5JttOQZmGGdD2DqG6Mv4SeuzRPFuWoerJMzLjDvlTdl9Pha6G8gEUFQgY0QkyGStwhj0AoUb5bf1ww1rSreZTVym9CQgDbQIDAQAB";

String pri = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzvoUhdOVYXdh4PlUK4atrWkC88Oo4qNFcaPuHZlHuy/Jry5C5Pxyjg+3YfuAC51ADgqnYLzZhSfQmlMLIEXZbUWNKC71GU8lLE3Pz4N5Cf7iZiElx3fBHUqsf2DGW/tJj5i52FB3BN+OOaHwpp9qk0PhtjDFcEjeVKNZmqJiVZpUEhsXIfKhI4o34j3OwlnZy0R3RX1NFTLCYI6rfBUltHh8566YtxqogfIPsp0TmAsfQxcWGcd0idDkm205BmYYZ0PYOoboy/hJ67NE8W5ah6skzMuMO+VN2X0+FrobyARQVCBjRCTIZK3CGPQChRvlt/XDDWtKt5lNXKb0JCANtAgMBAAECggEAC+cuAc0v8u4kC7J1B0dyhqVvbBO4LxBe7PO21HyeKGYxI5pTdzEKwHlYIuIkC40t602X2c0mmMLA/F0VmRIu+FUnchvc6O9bgTFEmH3nuhejLeeslXHRG6gJ1Q4IGqu9Wwg/Q2qJneYJl8CrmEaZYBjGmtqR2jsKm0IdEKdRk3MfLcO8fyG31R0vOaHAxTTnzJEImG7gmqSPvbSZ2IaYx8I8FlmmqblVNuChirWTr3yJVtS7UHrdin8P1RjlrZoeLiKmNh4qmugoIdtncOYRn6bmOK5sxE7TtP9Ki97Tm/jrSutzupxRO0qKvxz9WUHnqEsz4Bxcyw3T7pKH/2BdMQKBgQDjTMnOB3di3stVL4yyibAjx9IHRrYKVFTrxuPS94u3BI+YOFoTx56HSlO8gGWBYXz0g0sWVd9jM6dAc39epHvcSCpQcwJekNeOTh12PwbT6mu2hK2YkpA/eCr5tdobJ1iP5jfbpz09/GRPVnju29J3CKhMP8ppQFdkJRIaudWoWwKBgQDKcIv+bV2TWFW6JxhR2PBowoqy4u+JB1BX6cR4hB22XngfJ+zSnOVtJZBVgCDTf8pvxXPzis93fjgwX8qqkgnbWjbJ5ew7t7HHxbrAbY09EhF78BM+hw1Lc0rG4PkF7zLSww+NQ0andBc7CvldnOqp56Qsk5glCdXHD7wr/REN1wKBgQCWVel7vXB3EkiGFScHxw2a/MSrT1eDyXdJYoi4tkXQTNH0qgDZ6EOv07dCi+GXCzWsO1JkeXOAl19dv4ZUwJGzhn+GKis9BKutUXknBlSrwPZxB5wRt450jDRQaLjTENkAhBIZ06kr4E0wNE9UHEw9spotpFtp9cZXVDV/O75W1QKBgDFH6KyNTyRZcrUYY1E5cHzwLveRSyKehy5/l/aGov0MTk23WG2FCEzjwhkuUc9q4osHFE0LU6oRLfiIuTuAxamCcqf/stxuwXaSaf4CLUnapir3rJeiJNhjPqbfiX+qVUL9fUG0SPTmy+jxqPbjBjVKUKsRWw5ZMJN+/x3uQ0KNAoGAMz+zTfGQYqhOklKFlnTFeaSOyHLHlhbvCEl5hBDu7TAsFrQU3MDxBSsoe5aZBIAXu2EMM5bhlXymXXdSKU7a1D745rXkqu7IpWiIMfaeA889W2jWyPARjXE2+xGQ1qDRXMB6NMj+DmRqc0bfh/7K9rIFN8cX22cV8q5t1H/zGKQ=";*/

 

String pub = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAifSPkbqi6xNZq04Iran0EKePGNJrVC5CDjVZCKlV2AXtv/Oq9oqYruUIaUjbycu3DWNefi9PC7GQ63sXCHKvXu+ASqFo0eo2qrIppjw6h9WoeIAcoYuAQ5mjQqyNYCMPzfO4BwJQE8S80wNeEAUbV9l5f4K8vLiGx0ijaDtHrQIDAQAB";

String pri = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMCJ9I+RuqLrE1mrTgitqfQQp48Y0mtULkIONVkIqVXYBe2/86r2ipiu5QhpSNvJy7cNY15+L08LsZDrexcIcq9e74BKoWjR6jaqsimmPDqH1ah4gByhi4BDmaNCrI1gIw/N87gHAlATxLzTA14QBRtX2Xl/gry8uIbHSKNoO0etAgMBAAECgYB+eaCmtoms/1JEstydosZjRpVq0FlYm4GPbpnolGH3u+GZHWBIy46bYTed4Ns1VUd2RVsi9SzKddn8YlMG/Euodevdh89HjbcO4yOMOvXk0GW0AMyKN8XQdGj7DJ9a7bd5qghcfaRuwWhZfGkRwu5PTSzSwgPy3PDVgN4do4+6GQJBAPg2rSNDLM8GR8js7HqIsgQqGLzan+cxuER3lljft5tkmoQjUKKHKJ2eeta+1w0XmucJTFGtH+x49/9jrYf+BnMCQQDGlCxj1wZnKGkJBvPMgf/obQNU1r4aSuPA/qLH/EqWquK+cClSeCea7aozV2+8jjluBH6tg9qUyMpFqqtLwdFfAkEAuPP0+2uYvgLOBrgUVhH5pATCPiciM6Hmzo3VqA+7vryuLnwqH5FbAGgQ3GeD0yudrz5Mcifwu8I/+TuLGOR+ZQJAXdurH4WCgT+YZavjj8XiLvlXmcHmGIdNHus8BUo59vzOLzTUUyZ3kcLDr4CkT3rpqhZ1yY2Iwsok0MjaLfRuAQJBALu1qyeGHiYS0RA/VtR2HQe/upNQ/j7ahCaAUAYpva+tOOMPK8Pok3X8Nsc0iee1iChcAf8yEpBqUH5LTkQBm6w=";

String data = "加密密文不能保证正确。 也就是说,你在java端将信息加密后,也许你的密文在C#端不能被正确解密。这个时候就可能是加密密加密密文不能保证正确。 也就是说,你在java端将信息加密后,也许你的密文在C#端不能被正确解密。这个时候就可能是加密密文不正确导致的错误。这个时候你得看看你在加密时,有没有用一种C#里面没用到的东西,我一开始的时候文不正确导致的错误。这个时候你得看看你在加密时,有没有用一种C#里面没用到的东西,我一开始的时候";

try {

String result = encryptByPublicKey(data, pub);

System.out.println("公钥加密的结果=" + result);

System.out.println();

System.out.println("私钥解密的结果=" + decryptByPrivateKey(result, pri));

System.out.println();

String result1 = encryptByPrivateKey(data, pri);

System.out.println("私钥加密的结果=" + result1);

System.out.println();

System.out.println("公钥解密的结果=" + decryptByPublicKey(result1, pub));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

}

 

分享到:
评论

相关推荐

    java go RSA互相加解密

    java go RSA互相加解密 go rsa加密后可以用 java解密, java rsa加密后 可以用解密, 要把 txt文件中的秘钥和私钥 都复制粘贴到java 文件和go 文件 ,公钥和私钥统一才可以

    RSA加密算法实现以及C#与java互通加解密

    RSA加密算法实现以及C#与java互通加解密,解决RSA算法在java与C#相互通用

    RSA go java 相互加解密

    java go 可以互相通过RSA加密 解密, 公私是 openssl生成的, 公钥和私钥在java 和go文件中一致才可以互相加解密, txt中给了一个公钥和私钥, 可以粘贴进行测试

    Java实现Rsa非对称分段加解密方法源码分享

    代码描述了如何使用RSA算法进行非对称加密, 一对密钥由公钥和私钥组成(可以使用很多对密钥)。私钥可以解密公钥加密的数据,公钥可以解密私钥加密的数据(私钥公钥可以互相加密解密)

    Java实现基于RSA算法的非对称分段式双向加解密的数据接口安全认证源码分享.rar

    代码描述了如何使用RSA算法进行非对称加密, 一对密钥由公钥和私钥组成(可以使用很多对密钥)。私钥可以解密公钥加密的数据,公钥可以解密私钥加密的数据(私钥公钥可以互相加密解密)

    rsa-aes-utils:RSA、AES 加解密,支持 JavaScript 、Node.js、Java

    RSA、AES 加解密,浏览器端 JS 加密,服务端 nodejs、java 解密。 加解密介绍 加密算法分对称加密和非对称算法,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不...

    java和js的加密包包含RSA、AES和MD5

    前后端可互相加密解密的工具类,js文件引用CryptoJS和jsencrypy进行轻度封装。内有demo

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    基于openssl实现AES、DES、RSA、MD5、SM3、SM4等加解密和摘要功能.zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码...鼓励下载和使用,并欢迎大家互相学习,共同进步。

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

Global site tag (gtag.js) - Google Analytics