RSA非对称加密解密
2016-09-22 19:52
281 查看
RSA非对称加密解密
import org.apache.commons.codec.binary.Base64; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; 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; import java.util.HashMap; import java.util.Map; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; /** * Created by zxf on 2016/9/22. */ public class Rsa { public static final String KEY_ALGORITHM = "RSA"; /** 由于Android与服务器的的问题这里必须是:RSA/NONE/PKCS1Padding,未验证 */ public static final String CIPHER_ALGORITHM = "RSA/NONE/PKCS1Padding"; public static final String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIRdil4gf0xCBbWWhLdXLcBNcDAxm131ZbrrA7p6kz3HKT3GqfoVQCwbgZ9JyvW/KhmNI4I2+PGX+Nbg1rLyDE0CAwEAAQ=="; //public static final String PRIVATE_KEY = "privateKey"; public static final String PRIVATE_KEY = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAhF2KXiB/TEIFtZaEt1ctwE1wMDGbXfVluusDunqTPccpPcap+hVALBuBn0nK9b8qGY0jgjb48Zf41uDWsvIMTQIDAQABAkBQXTKbP4PKWvN4crCVV/rRHLMWr6ey/kELoZCb8bvf71uEFLgk7Q9GEvM6F4ucH9Mp8qexJUBEWwGpmolkO4GJAiEA6nGVJ970KEjTYd4RuEJ0zrTilQZ0Q52Yk/kvtIiZFqMCIQCQiTQRQoJVBvL74tzbW++vFdPw4gadOs7BKTkjGYywTwIgTrBy/N/zmXXgJVAxKGR96keCabyx12QVK02POoxCvfsCIAhVkQYJwsAqZWp222tessRyysTSE7WPRYrH2L6YY49rAiEAxREH2PCWeA4Q4eh2JnpRFS3w2pdrvYUlT/97FG3oXlI="; /** RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024 */ public static final int KEY_SIZE = 1024; public static final String PLAIN_TEXT = "lamboo"; public static void main(String[] args) { // 加密 PublicKey publicKey = restorePublicKey(Base64.decodeBase64(PUBLIC_KEY)); byte[] encodedText = RSAEncode(publicKey, PLAIN_TEXT.getBytes()); System.out.println("RSA encoded: " + Base64.encodeBase64String(encodedText)); // 解密 PrivateKey privateKey = restorePrivateKey(Base64.decodeBase64(PRIVATE_KEY)); System.out.println("RSA decoded: "+ RSADecode(privateKey, encodedText)); } /** * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范 * * @param keyBytes * @return */ public static PublicKey restorePublicKey(byte[] keyBytes) { X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); try { KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec); return publicKey; } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { // TO 4000 DO Auto-generated catch block e.printStackTrace(); } return null; } /** * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范 * * @param keyBytes * @return */ public static PrivateKey restorePrivateKey(byte[] keyBytes) { PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec( keyBytes); try { KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateKey = factory .generatePrivate(pkcs8EncodedKeySpec); return privateKey; } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 加密,三步走。 * * @param key * @param plainText * @return */ public static byte[] RSAEncode(PublicKey key, byte[] plainText) { try { Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(plainText); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 解密,三步走。 * * @param key * @param encodedText * @return */ public static String RSADecode(PrivateKey key, byte[] encodedText) { try { Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key); return new String(cipher.doFinal(encodedText)); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
相关文章推荐
- 关于解决RSA非对称加密时,将密文存入数据库取出后,再对密文解密的时候抛出javax.crypto.BadPaddingException: Data must start with zero
- RSA不限长度非对称加密解密C#
- JAVA 获取RSA非对称加密,私钥加密、公钥解密
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
- 对文件压缩加密,解密解压缩,非对称加密,RSA,AES算法
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
- php rsa加密解密实例(非对称加密)
- openssl RSA非对称加密解密
- Java对称与非对称加密解密,AES与RSA
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
- RSA(非对称)压缩加密/解压缩解密||AES(对称)压缩加密/解压缩解密
- 非对称加解密——RSA加密、解密以及数字签名
- RSA非对称加密解密例子
- OpenSSL生成证书进行iOS加密,java解密的RSA非对称加密 详解
- python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA
- openssl 非对称加密 RSA 加密解密以及签名验证签名
- RSA非对称加密和解密方法
- RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密
- 漫谈iOS RSA非对称加密与解密
- JAVA实现RSA加密解密 非对称算法