首页 > 编程语言 >java RSA 私钥解密、公钥解密

java RSA 私钥解密、公钥解密

时间:2023-09-15 17:55:23浏览次数:37  
标签:公钥 私钥 java cache 解密 offSet import byte

import org.apache.commons.codec.binary.Base64;
import sun.security.rsa.RSAPrivateCrtKeyImpl;
import org.bouncycastle.util.encoders.Hex;

import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class CountRsaUtil {

/**
* 私钥解密
* @param encryptedData 加密数据
* @param privateKey 私钥
* @return 解密结果
*/
public static byte[] decryptByPrivateKey(String encryptedData, String privateKey) {
try {
byte[] encryptedDataByte = hexStr2Bytes(encryptedData);
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);
int inputLen = encryptedDataByte.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > 128) {
cache = cipher.doFinal(encryptedDataByte, offSet, 128);
} else {
cache = cipher.doFinal(encryptedDataByte, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * 128;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
} catch (Exception e) {
}
return null;
}

/**
* 公钥解密
*
* @param encryptedData 已加密数据
* @param privateKey 私钥(BASE64编码)
* @return 解密结果
*/
public static byte[] decryptByPublicKey(String encryptedData, String privateKey) {
try {
byte[] keyBytes = Base64.decodeBase64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateCrtKeyImpl privateK = (RSAPrivateCrtKeyImpl) keyFactory.generatePrivate(pkcs8KeySpec);
RSAPublicKeySpec rsaPubKeySpec = new RSAPublicKeySpec(privateK.getModulus(), privateK.getPublicExponent());
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(rsaPubKeySpec);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
// 初始化解密
cipher.init(Cipher.DECRYPT_MODE, publicKey);

byte[] encryptedDataByte = hexStr2Bytes(encryptedData);
int inputLen = encryptedDataByte.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > 128) {
cache = cipher.doFinal(encryptedDataByte, offSet, 128);
} else {
cache = cipher.doFinal(encryptedDataByte, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * 128;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
} catch (Exception e) {
}
return null;
}
   
public static byte[] hexStr2Bytes(String var0) {
return Hex.decode(var0);
}

}

标签:公钥,私钥,java,cache,解密,offSet,import,byte
From: https://www.cnblogs.com/lcxz/p/17705631.html

相关文章

  • 解密MySQL中强大的武器——REGEXP正则表达式
    家人们,今天我来为大家介绍一项在MySQL中非常强大的武器——REGEXP正则表达式。MySQL作为一款广泛使用的关系型数据库管理系统,其内置的REGEXP关键字为我们提供了强大的正则表达式功能,使得我们可以更加灵活和高效地进行数据匹配和处理。以下是一些常见的用法和语法规则来详解REG......
  • crypto 加解密库简介与测试【GO 常用的库】
    〇、前言GO语言的标准库crypto提供了一组用于加密和解密的包,包括对称加密、哈希函数、数字签名、随机数生成等功能。在日常开发中,通过使用这些库,可以确保数据的安全性和完整性。对于使用频率比较高的东西,还是要汇总一下用来备查。一、md5加密md5包实现了RFC1321中定义......
  • 逆向使用的公共加密解密的方法与算法
    python的AES加密解密方法-ECB模式fromCrypto.CipherimportAESimportbase64fromCrypto.Util.Paddingimportunpad,paddefdecrypt_aes(ciphertext,key):ciphertext=base64.b64decode(ciphertext)#使用base64解码密文cipher......
  • AES解密控制台打印出乱码解决方法
    使用其它方法控制台一直打印出乱码,后来使用了这种方法,一下就解决乱码问题。代码如下:fromCrypto.CipherimportAESfrombinasciiimporta2b_hexdefungenerateAES(key,text):aes=AES.new(str.encode(key),AES.MODE_ECB)aes_text=aes.decrypt(a2b_hex(text)).decode(......
  • java安全架构____DES加密解密
    //READMEDES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:1)初始置换其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位…依此类推,最后一位是......
  • java安全架构____java DSA加密解密
    importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.securit......
  • HashCat解密成功界面提示
    一、命令行显示Status…:Cracked:代表已找到密码。二、结果输出到文件。-oout.txthashcat.exe-m13000-a3'$rar5$16$fd80c0dad768537589fd4a01167abade$15$576345a86e55ff8cd1258d28b6c5e1b5$8$ecbfa2295c0972e4'wlzhg@[email protected]三、没有用-o指定保......
  • 解密滴滴面试:foreach为什么在性能上领先for循环?
    正文大家好,我是小米!今天我要和大家分享一个有关Java编程的热门话题:为什么在Java中使用foreach循环比传统的for循环更快?这个问题在Java开发者社区中一直备受关注,我会尽力为大家解答这个问题,并提供一些有趣的示例来帮助大家更好地理解。背景在Java中,我们经常需要遍历数组或集合来处理......
  • 基于Python实现一个在线加密解密网站系统
    在这个数字化时代,数据的安全和隐私变得越来越重要。想象一下,如果我们之间的通信被窃听,或者我们存储的数据被不正当地访问,将会有怎样的后果?这就是为什么加密技术在现代技术领域中变得如此重要的原因。但加密技术听起来可能有些高深,让很多人望而生畏。今天,我要带领大家实现一个简单......
  • app备案公钥指纹包名获取
    APP备案是什么?听起来好像是个新词,其实跟网站域名备案差不多,目的为了限制一些非法套壳的APP,有了备案号就可以第一时间查到当前APP的开发者是谁。中国工信部于2023年8月份出台了新规定,要求移动应用制造商在通过应用市场销售前需向政府备案,8月底已经开始实行所有在国内运营的......