`

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算法简介 RSA算法是一种非对称加密算法,由Ron Rivest、Adi Shamir 和 Leonard Adleman 在1977年提出,并以其三人的名字首字母命名。RSA算法的安全性基于...

    RSA.rar_java RSA_rsa_rsa java_rsa加密解密

    在Java中,我们可以利用Java Cryptography Extension (JCE) 库来实现RSA的加密和解密操作。这个RAR压缩包中的内容可能包含了一些基础的RSA加密解密的Java源代码示例,对于初学者来说是很好的学习资源。 RSA的核心...

    java与javascript互相加解密

    本篇将深入探讨如何使用DES(Data Encryption Standard)算法在Java和JavaScript之间进行安全的加解密操作。 DES是一种对称加密算法,它使用相同的密钥进行加密和解密,具有速度快、效率高的特点,但因为其密钥长度...

    c/c++与java互通 AES加密解密

    "C/C++与Java互通AES加密解密"的主题就是这两个议题的结合。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,提供了强效的数据保护。本话题主要探讨如何在C/C++和Java之间使用...

    rsa前端加密,java后台解密

    在Java Web项目中,实现这个功能可以使用Java的`java.security`包,其中包含`KeyPairGenerator`用于生成密钥对,`Cipher`用于加解密操作。对于前端,JavaScript也有相应的库,如`crypto-js`,可以进行RSA加密。 **...

    Portable PGP Java版PGP加密解密程序

    Java版PGP程序利用了PGP的强大安全机制,如RSA、DSA等公钥加密算法和SHA-1或MD5等哈希算法,提供了高标准的数据保护。其优势在于: 1. **平台无关性**:由于基于Java,程序可以在任何支持Java的平台上运行。 2. **...

    Ras加密解密,PHP和JAVA互通

    在PHP和Java之间实现RSA加密解密的互通,需要确保两个环境都正确地处理PEM格式的密钥,并使用相同的标准库进行加密和解密。PHP中,我们可以使用openssl扩展来操作RSA密钥,例如`openssl_pkey_new()`用于生成密钥对,...

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

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

    RSA体系 c++/java相互进行加签验签

    - 要使C++和Java的签名结果互相认可,必须确保两个环境中的RSA实现遵循相同的规范,比如签名算法(如SHA-1或SHA-256与RSA的组合),以及Base64编码的实现一致。 8. **安全性考虑**: - 在实际应用中,应确保密钥...

    RSA算法Android C#互通

    它的主要特点是使用一对公钥和私钥进行加解密,其中公钥可以公开,而私钥必须保密。在Android和C#之间进行数据安全传输时,RSA算法常被用于确保数据的机密性和完整性。 在“RSA算法Android C#互通”这个场景下,...

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

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

    Java非对称加密源码实例

    在Java中,`java.security.KeyPairGenerator`类可以用于生成RSA密钥对,而`javax.crypto.Cipher`类则负责加密和解密操作。 2. DSA(Digital Signature Algorithm):DSA主要用于数字签名,而非数据加密,它提供了一...

    java源码包3

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

    java源码包2

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

    Java Objective C Encrypt/Decrypt Eclipse and XCode Project and Source Code

    5. **跨语言平台互操作**:Java和Objective-C的加密代码可以互相交互,意味着在Java中加密的数据可以在Objective-C环境中解密,反之亦然。这在多平台应用开发中十分有用,例如Android和iOS应用之间的数据交换。 在...

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

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

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

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

    java源码包4

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

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

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

Global site tag (gtag.js) - Google Analytics