Java安全之安全加密算法( 四 )

RSARSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥 , “由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。 RSA算法实现了公钥加密、私钥解密 和私钥解密、公钥加密的一个机制 。
也就是说使用公钥来进行加密 , 想要解密获取明文内容 , 就必须使用对应的私钥来进行解密 。 而在其中私钥中的内容其实是比较长的 , 而公钥里面的内容会偏短一些 。 因为私钥一般会储存在本地 , 而公钥会放到各大互联网上 , 公钥比私钥内容短也是为了方便传输和存储 。
代码示例:package com.demo;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import sun.misc.BASE64Encoder;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;public class rsademo {private static String name = "xiaoming";public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {//1.初始化密钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//设置获取RSA的密钥keyPairGenerator.initialize(512);//设置密钥长度KeyPair keyPair = keyPairGenerator.generateKeyPair();//生成密钥对RSAPublicKey rsaPublic =(RSAPublicKey) keyPair.getPublic();//获取公钥RSAPrivateKey rsaPrivate = (RSAPrivateKey)keyPair.getPrivate();//获取私钥//System.out.println(new BASE64Encoder().encode(rsaPublic.getEncoded()));//输出公钥System.out.println("");//System.out.println(new BASE64Encoder().encode(rsaPrivate.getEncoded()));//输出私钥//2.私钥加密、公钥解密PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivate.getEncoded());//对密钥进行编码处理KeyFactory rsa = KeyFactory.getInstance("RSA");//设置获取RSA的密钥PrivateKey privateKey = rsa.generatePrivate(pkcs8EncodedKeySpec);//从提供的密钥规范生成私钥对象 。 //2.1私钥加密Cipher encodecipher = Cipher.getInstance("RSA");//设置获取RSA的密钥encodecipher.init(Cipher.ENCRYPT_MODE,privateKey);//设置为加密类型并传入私钥进行加密byte[] res = encodecipher.doFinal(name.getBytes());//对内容进行加密System.out.println(new BASE64Encoder().encode(res));//2.2公钥解密X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublic.getEncoded());//对公钥进行编码处理rsa = KeyFactory.getInstance("RSA");//设置获取RSA的密钥PublicKey publicKey = rsa.generatePublic(x509EncodedKeySpec);//从提供的密钥规范生成公钥对象 。Cipher decodecipher = Cipher.getInstance("RSA");//设置获取RSA的密钥decodecipher.init(Cipher.DECRYPT_MODE,publicKey);//设置解密类型并传入公钥进行解密byte[] decoderes = decodecipher.doFinal(res);//对内容进行解密System.out.println(new String(decoderes));}}
Java安全之安全加密算法文章插图
下面再来看个公钥加密私钥解密的代码
package com.demo;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import sun.misc.BASE64Encoder;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;public class rsademo {private static String name = "xiaoming";public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {//1.初始化密钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//设置获取RSA的密钥keyPairGenerator.initialize(512);//设置密钥长度KeyPair keyPair = keyPairGenerator.generateKeyPair();//生成密钥对RSAPublicKey rsaPublic =(RSAPublicKey) keyPair.getPublic();//获取公钥RSAPrivateKey rsaPrivate = (RSAPrivateKey)keyPair.getPrivate();//获取私钥//System.out.println(new BASE64Encoder().encode(rsaPublic.getEncoded()));//输出公钥System.out.println("");//3.公钥加密、私钥解密//3.1公钥加密X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublic.getEncoded());KeyFactory encodersa = KeyFactory.getInstance("RSA");PublicKey publicKey = encodersa.generatePublic(x509EncodedKeySpec);Cipher encodecipher = Cipher.getInstance("RSA");encodecipher.init(Cipher.ENCRYPT_MODE,publicKey);byte[] encoderes = encodecipher.doFinal(name.getBytes());System.out.println(new BASE64Encoder().encode(encoderes));//3.2私钥解密PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivate.getEncoded());KeyFactory decodersa = KeyFactory.getInstance("RSA");PrivateKey privateKey = decodersa.generatePrivate(pkcs8EncodedKeySpec);Cipher decodecipher = Cipher.getInstance("RSA");decodecipher.init(Cipher.DECRYPT_MODE,privateKey);byte[] decoderes = decodecipher.doFinal(encoderes);System.out.println(new String(decoderes));}}