关于RSA加密算法的工具类
最近在捣鼓SSO(单点登录),就是一个在应用(系统)登录之后,当切换其他应用(系统)的时候,可以省去登录,提高用户的使用的便捷。(具体有时间在写)
期间涉及的安全问题,发送数据涉及账户密码以及分布系统之间的信息安全问题。
package test.rsa;
import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.interfaces.*;
import java.security.spec.*;
import javax.crypto.*;
import org.bouncycastle.util.encoders.Hex;
import sun.misc.*;
public class TestRSA {
/**
* * 生成密钥对 *
*
* @return KeyPair *
* @throws EncryptException
*/
public static KeyPair generateKeyPair() throws Exception {
try {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",
new org.bouncycastle.jce.provider.BouncyCastleProvider());
final int KEY_SIZE = 1024;// 块加密的大小,是不要太大,否则效率会低
keyPairGen.initialize(KEY_SIZE, new SecureRandom());
KeyPair keyPair = keyPairGen.generateKeyPair();
saveKeyPair(keyPair);
return keyPair;
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
public static KeyPair getKeyPair() throws Exception {
FileInputStream fis = new FileInputStream(
"D:/javasoft/TempTest/RSAKey.txt");
ObjectInputStream oos = new ObjectInputStream(fis);
KeyPair kp = (KeyPair) oos.readObject();
oos.close();
fis.close();
return kp;
}
public static void saveKeyPair(KeyPair kp) throws Exception {
FileOutputStream fos = new FileOutputStream(
"D:/javasoft/TempTest/RSAKey.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
// 生成密钥
oos.writeObject(kp);
oos.close();
fos.close();
}
/**
* * 生成公钥 *
*
* @param modulus *
* @param publicExponent *
* @return RSAPublicKey *
* @throws Exception
*/
public static RSAPublicKey generateRSAPublicKey(byte[] modulus,
byte[] publicExponent) throws Exception {
KeyFactory keyFac = null;
try {
keyFac = KeyFactory.getInstance("RSA",
new org.bouncycastle.jce.provider.BouncyCastleProvider());
} catch (NoSuchAlgorithmException ex) {
throw new Exception(ex.getMessage());
}
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(
modulus), new BigInteger(publicExponent));
try {
return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);
} catch (InvalidKeySpecException ex) {
throw new Exception(ex.getMessage());
}
}
/**
* * 生成私钥 *
*
* @param modulus *
* @param privateExponent *
* @return RSAPrivateKey *
* @throws Exception
*/
public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,
byte[] privateExponent) throws Exception {
KeyFactory keyFac = null;
try {
keyFac = KeyFactory.getInstance("RSA",
new org.bouncycastle.jce.provider.BouncyCastleProvider());
} catch (NoSuchAlgorithmException ex) {
throw new Exception(ex.getMessage());
}
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(
modulus), new BigInteger(privateExponent));
try {
return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);
} catch (InvalidKeySpecException ex) {
throw new Exception(ex.getMessage());
}
}
/**
* 加密的方法
* @throws IOException
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
*/
private static String encrypt(PublicKey pk,String source) throws Exception{
Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] sbt = source.getBytes();
byte[] epByte = cipher.doFinal(sbt);
BASE64Encoder encoder = new BASE64Encoder();
String epStr = encoder.encode(epByte);
return epStr;
}
private static String encrypt1(PublicKey pk,String source) throws Exception{
Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] s = source.getBytes();
byte[] en_s = cipher.doFinal(s);
return new String(Hex.encode(en_s));
}
/**
* 解密的方法
* @throws Exception
*/
public static String decrypt(PrivateKey pk,String source) throws Exception {
/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
cipher.init(Cipher.DECRYPT_MODE, pk);
BASE64Decoder decoder = new BASE64Decoder();
byte[] b1 = decoder.decodeBuffer(source);
/** 执行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}
public static String decrypt1(PrivateKey pk,String source) throws Exception {
/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
Cipher cipher = Cipher.getInstance("RSA",new org.bouncycastle.jce.provider.BouncyCastleProvider());
cipher.init(Cipher.DECRYPT_MODE, pk);
/** 执行解密操作 */
byte[] b = cipher.doFinal(Hex.decode(source));
return new String(b);
}
public static void main(String[] args) throws Exception {
String s = "1-Test-我";
String en_s = encrypt1(getKeyPair().getPublic(), s);
System.out.println("----------------分割线--------------------------");
System.out.println("加密之后:");
System.out.println(en_s);
System.out.println("----------------分割线--------------------------");
String de_s = decrypt1(getKeyPair().getPrivate(),en_s);
System.out.println("还原密文:");
System.out.println(de_s);
}
}
Have a nice day~
分享到:
相关推荐
包含了: AES加密算法 DES加密算法 CBC/ ECB加密模式 MD5加密算法 RSA加密算法 SHA1加密算法 SHA256加密算法
RSA加密算法
java加密算法工具类,有RSA,MD5等等。方便实用。
MD5算法,URLEncoding,Base64编码,AES,DES,DESede,RSA加密解密工具类和使用实例
本工具类提供了RSA算法的加密解密及密钥的生成算法,包含注释文档
加密算法RSA,支持加密解密算法,Java调用均可使用,亲测可用
自己封装的RSA加解密工具类,
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不...
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 这时一个简单的Java实现,在RSA网络安全工具类是比较完整的实现。
RSA与AES混合加密算法的实现http://blog.csdn.net/jkxqj/article/details/25228707
安卓各种加密算法的实现 工具类 能直接拿来调用
支持模长N、私钥D、指数E、CRT五元组运算模式...支持功能:密钥产生、密钥检测(实用)、公钥加密、私钥解密、密钥补全(非常实用,输入P、Q后补全后面的DP\DQ\Qinv,以及根据NDE补全CRT五元组),提供给有需要的开发者
RSA 工具类。提供加密,解密,生成密钥对等方法。 * 需要到http://www.bouncycastle.org下载bcprov-jdk14-123.jar。 * RSA加密原理概述 * RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(大于100的...
根据证书私钥加签---》RSA公钥加密--》RSA私钥解密---》证书公钥验签
RSA加密解密签名加签验签RsaUtils工具类 RSA算法基于大数因子分解难题,提供了公钥加密和私钥解密的能力。公钥用于加密,私钥则负责解密。这种特性使得RSA成为保证数据传输安全的理想选择。 公钥加密私钥解密与...
ASR(Asymmetric Signcryption)是一种非对称加密算法,它结合了对称加密和非对称加密的优点,用于保护数据的机密性和完整性。 ASR 的核心思想是使用一对公钥和私钥来进行加密和解密。其中,公钥用于加密数据,私钥...
这是用RSA算法所编写的加密小程序,初学C++界面程序编程,有很多函数还都不是很了解 -_-! 我也就学别人“拿来主义” 借用了大师们的几个类,用的不好还请见谅! 小弟:叶小全
所以当时在cryptopp的基础上做了一些封装,并且将RSA,AES,SHA1,RSA-SHA1 Sign分离成独立的类,并且添加了Base16和Base64编码算法,使用这几个加密算法,几乎可以解决一般项目对通信安全的需要。 Java部分使用了JDK...
RSA加密算法工具类
RSA为最常用的一种非对称方式的算法,这次封装的Utils类完成了公钥加密、私钥解密、私钥加签、公钥验签四种常用方法。