|
首先我们可以从上图看到:明文--->公钥--->密文
- import
java.security.Key; - import
java.security.KeyFactory; - import
java.security.KeyPair; - import
java.security.KeyPairGenerator; - import
java.security.PrivateKey; - import
java.security.PublicKey; - import
java.security.interfaces.RSAPrivateKey; - import
java.security.interfaces.RSAPublicKey; - import
java.security.spec.PKCS8EncodedKeySpec; - import
java.security.spec.X509EncodedKeySpec; -
- import
javax.crypto.Cipher; -
- import
sun.misc.BASE64Decoder; - import
sun.misc.BASE64Encoder; -
-
- public
class RSAHelper { -
-
-
public static PublicKey getPublicKey(String key) throws Exception { -
byte[] keyBytes; -
keyBytes = (new BASE64Decoder()).decodeBuffer(key); -
-
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); -
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); -
PublicKey publicKey = keyFactory.generatePublic(keySpec); -
return publicKey; -
} -
-
public static PrivateKey getPrivateKey(String key) throws Exception { -
byte[] keyBytes; -
keyBytes = (new BASE64Decoder()).decodeBuffer(key); -
-
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); -
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); -
PrivateKey privateKey = keyFactory.generatePrivate(keySpec); -
return privateKey; -
} -
-
-
public static String getKeyString(Key key) throws Exception { -
byte[] keyBytes = key.getEncoded(); -
String s = (new BASE64Encoder()).encode(keyBytes); -
return s; -
} -
-
-
public static void main(String[] args) throws Exception { -
-
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); -
//密钥位数 -
keyPairGen.initialize(1024); -
//密钥对 -
KeyPair keyPair = keyPairGen.generateKeyPair(); -
-
// 公钥 -
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); -
-
// 私钥 -
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); -
-
String publicKeyString = getKeyString(publicKey); -
System.out.println("public:/n" + publicKeyString); -
-
String privateKeyString = getKeyString(privateKey); -
System.out.println("private:/n" + privateKeyString); -
-
//加解密类 -
Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding"); -
-
//明文 -
byte[] plainText = "我们都很好!邮件:@sina.com".getBytes(); -
-
//加密 -
cipher.init(Cipher.ENCRYPT_MODE, publicKey); -
byte[] enBytes = cipher.doFinal(plainText); -
-
//通过密钥字符串得到密钥 -
publicKey = getPublicKey(publicKeyString); -
privateKey = getPrivateKey(privateKeyString); -
-
//解密 -
cipher.init(Cipher.DECRYPT_MODE, privateKey); -
byte[]deBytes = cipher.doFinal(enBytes); -
-
publicKeyString = getKeyString(publicKey); -
System.out.println("public:/n" +publicKeyString); -
-
privateKeyString = getKeyString(privateKey); -
System.out.println("private:/n" + privateKeyString); -
-
String s = new String(deBytes); -
System.out.println(s); -
-
-
} -
- }
在实际开发中! 我们通过自己的modulus
- import
java.math.BigInteger; -
- import
java.security.KeyFactory; -
- import
java.security.PrivateKey; -
- import
java.security.PublicKey; -
- import
java.security.spec.RSAPrivateKeySpec; -
- import
java.security.spec.RSAPublicKeySpec; -
-
-
- import
javax.crypto.Cipher; -
-
-
- public
class RsaKey { -
-
-
-
public PublicKey getPublicKey(String modulus,String publicExponent) throws Exception { -
-
BigInteger m = new BigInteger(modulus); -
-
BigInteger e = new BigInteger(publicExponent); -
-
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m,e); -
-
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); -
PublicKey publicKey = keyFactory.generatePublic(keySpec); -
-
return publicKey; -
-
} -
-
-
-
public PrivateKey getPrivateKey(String modulus,String privateExponent) throws Exception { -
-
BigInteger m = new BigInteger(modulus); -
-
BigInteger e = new BigInteger(privateExponent); -
-
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m,e); -
-
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); -
-
PrivateKey privateKey = keyFactory.generatePrivate(keySpec); -
-
return privateKey; -
-
} -
-
-
-
public static void main(String[] args) throws Exception { -
-
String modulus = "101031667457096007802156 165518376978328164137144 710625223425380609435960 368599673338708277903585 554552322433835805651872 806431590508699244360814 47583051139"; -
-
String publicExponent = "65537"; -
-
String privateExponet = "367979294475011322800474 185715497882523349856362 702385535371444397399388 741997039894583483410120 364529325888461124714276 674612930833020362278754 665756193"; -
-
-
-
RsaKey key = new RsaKey(); -
-
PublicKey publicKey = key.getPublicKey(modulus, publicExponent); -
-
PrivateKey privateKey = key.getPrivateKey(modulus, privateExponet); -
-
-
-
-
-
//加解密类 -
-
Cipher cipher = Cipher.getInstance("RSA"); //"RSA/ECB/PKCS1Padding" 就是:“算法/工作模式/填充模式” -
-
-
-
//明文 -
-
byte[] plainText = "hello world !".getBytes(); -
-
-
-
//加密 -
-
cipher.init(Cipher.ENCRYPT_MODE, publicKey); -
-
byte[] enBytes = cipher.doFinal(plainText); -
-
-
-
-
-
cipher.init(Cipher.DECRYPT_MODE, privateKey); -
-
byte[]deBytes = cipher.doFinal(enBytes); -
-
-
-
String s = new String(deBytes); -
-
System.out.println(s); -
-
-
-
}
- }