转载转载 非对称加密算法RSA http://snowolf.iteye.com/blog/379860

来源:互联网 发布:在淘宝卖手机 编辑:程序博客网 时间:2024/06/01 23:23

转载转载 非对称加密算法RSA   http://snowolf.iteye.com/blog/379860

RSACoderTest:

import static org.junit.Assert.*;import org.junit.Before;import org.junit.Test;import java.util.Map;/** * @author 梁栋 * @version 1.0 * @since 1.0 */public class RSACoderTest{    private String publicKey;    private String privateKey;    @Before    public void setUp() throws Exception    {        Map<String, Object> keyMap = RSACoder.initKey();        publicKey = RSACoder.getPublicKey(keyMap);//encryptBASE64(key.getEncoded());        privateKey = RSACoder.getPrivateKey(keyMap);//encryptBASE64(key.getEncoded());        System.err.println("公钥: \n\r" + publicKey);        System.err.println("私钥: \n\r" + privateKey);    }    @Test    public void test() throws Exception    {        System.err.println("公钥加密——私钥解密");        String inputStr = "abc";        byte[] data = inputStr.getBytes();        byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);        byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData,                privateKey);        String outputStr = new String(decodedData);        System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);        assertEquals(inputStr, outputStr);    }    @Test    public void testSign() throws Exception    {        System.err.println("私钥加密——公钥解密");        String inputStr = "sign";        byte[] data = inputStr.getBytes();        byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);        byte[] decodedData = RSACoder                .decryptByPublicKey(encodedData, publicKey);        String outputStr = new String(decodedData);        System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);        assertEquals(inputStr, outputStr);        System.err.println("私钥签名——公钥验证签名");        // 产生签名        String sign = RSACoder.sign(encodedData, privateKey);        System.err.println("签名:\r" + sign);        // 验证签名        boolean status = RSACoder.verify(encodedData, publicKey, sign);        System.err.println("状态:\r" + status);        assertTrue(status);    }}

RSACoder.java

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.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;/*** RSA安全编码组件* @author 梁栋* @version 1.0* @since 1.0*/public abstract class RSACoder extends Coder{   public static final String KEY_ALGORITHM = "RSA";   public static final String SIGNATURE_ALGORITHM = "MD5withRSA";   private static final String PUBLIC_KEY = "RSAPublicKey";   private static final String PRIVATE_KEY = "RSAPrivateKey";    /**    * 用私钥对信息生成数字签名    * @param data       加密数据    * @param privateKey 私钥    * @return    * @throws Exception    */   public static String sign(byte[] data, String privateKey) throws Exception   {       // 解密由base64编码的私钥       byte[] keyBytes = decryptBASE64(privateKey);       // 构造PKCS8EncodedKeySpec对象       PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);       // KEY_ALGORITHM 指定的加密算法       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);       // 取私钥匙对象       PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);       // 用私钥对信息生成数字签名       Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);       signature.initSign(priKey);       signature.update(data);       return encryptBASE64(signature.sign());   }    /**    * 校验数字签名    * @param data      加密数据    * @param publicKey 公钥    * @param sign      数字签名    * @return 校验成功返回true 失败返回false    * @throws Exception    */   public static boolean verify(byte[] data, String publicKey, String sign)           throws Exception   {       // 解密由base64编码的公钥       byte[] keyBytes = decryptBASE64(publicKey);       // 构造X509EncodedKeySpec对象       X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);       // KEY_ALGORITHM 指定的加密算法       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);       // 取公钥匙对象       PublicKey pubKey = keyFactory.generatePublic(keySpec);       Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);       signature.initVerify(pubKey);       signature.update(data);       // 验证签名是否正常       return signature.verify(decryptBASE64(sign));   }    /**    * 解密<br>    * 用私钥解密    * @param data    * @param key    * @return    * @throws Exception    */   public static byte[] decryptByPrivateKey(byte[] data, String key)           throws Exception   {       // 对密钥解密       byte[] keyBytes = decryptBASE64(key);       // 取得私钥       PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);       Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);       // 对数据解密       Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());       cipher.init(Cipher.DECRYPT_MODE, privateKey);       return cipher.doFinal(data);   }    /**    * 解密<br>    * 用公钥解密    * @param data    * @param key    * @return    * @throws Exception    */   public static byte[] decryptByPublicKey(byte[] data, String key)           throws Exception   {       // 对密钥解密       byte[] keyBytes = decryptBASE64(key);       // 取得公钥       X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);       Key publicKey = keyFactory.generatePublic(x509KeySpec);       // 对数据解密       Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());       cipher.init(Cipher.DECRYPT_MODE, publicKey);       return cipher.doFinal(data);   }    /**    * 加密<br>    * 用公钥加密    * @param data    * @param key    * @return    * @throws Exception    */   public static byte[] encryptByPublicKey(byte[] data, String key)           throws Exception   {       // 对公钥解密       byte[] keyBytes = decryptBASE64(key);       // 取得公钥       X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);       Key publicKey = keyFactory.generatePublic(x509KeySpec);       // 对数据加密       Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());       cipher.init(Cipher.ENCRYPT_MODE, publicKey);       return cipher.doFinal(data);   }    /**    * 加密<br>    * 用私钥加密    * @param data    * @param key    * @return    * @throws Exception    */   public static byte[] encryptByPrivateKey(byte[] data, String key)           throws Exception   {       // 对密钥解密       byte[] keyBytes = decryptBASE64(key);       // 取得私钥       PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);       Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);       // 对数据加密       Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());       cipher.init(Cipher.ENCRYPT_MODE, privateKey);       return cipher.doFinal(data);   }    /**    * 取得私钥    *    * @param keyMap    * @return    * @throws Exception    */   public static String getPrivateKey(Map<String, Object> keyMap)           throws Exception   {       Key key = (Key) keyMap.get(PRIVATE_KEY);       return encryptBASE64(key.getEncoded());//   }    /**    * 取得公钥    *    * @param keyMap    * @return    * @throws Exception    */   public static String getPublicKey(Map<String, Object> keyMap)           throws Exception   {       Key key = (Key) keyMap.get(PUBLIC_KEY);       return encryptBASE64(key.getEncoded());   }    /**    * 初始化密钥    *    * @return    * @throws Exception    */   public static Map<String, Object> initKey() throws Exception   {       KeyPairGenerator keyPairGen = KeyPairGenerator               .getInstance(KEY_ALGORITHM);       keyPairGen.initialize(1024);       KeyPair keyPair = keyPairGen.generateKeyPair();       // 公钥       RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();       // 私钥       RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();       Map<String, Object> keyMap = new HashMap<String, Object>(2);       keyMap.put(PUBLIC_KEY, publicKey);       keyMap.put(PRIVATE_KEY, privateKey);       return keyMap;   }}


Coder.java

import java.security.MessageDigest;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/*** 基础加密组件** @author 梁栋* @version 1.0* @since 1.0*/public abstract class Coder {   public static final String KEY_SHA = "SHA";   public static final String KEY_MD5 = "MD5";    /**    * MAC算法可选以下多种算法    *    * <pre>    * HmacMD5    * HmacSHA1    * HmacSHA256    * HmacSHA384    * HmacSHA512    * </pre>    */   public static final String KEY_MAC = "HmacMD5";    /**    * BASE64解密    * @param key    * @return    * @throws Exception    */   public static byte[] decryptBASE64(String key) throws Exception {       return (new BASE64Decoder()).decodeBuffer(key);   }    /**    * BASE64加密    * @param key    * @return    * @throws Exception    */   public static String encryptBASE64(byte[] key) throws Exception {       return (new BASE64Encoder()).encodeBuffer(key);   }    /**    * MD5加密    * @param data    * @return    * @throws Exception    */   public static byte[] encryptMD5(byte[] data) throws Exception {        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);       md5.update(data);        return md5.digest();    }    /**    * SHA加密    * @param data    * @return    * @throws Exception    */   public static byte[] encryptSHA(byte[] data) throws Exception {        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);       sha.update(data);        return sha.digest();    }    /**    * 初始化HMAC密钥    * @return    * @throws Exception    */   public static String initMacKey() throws Exception {       KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);        SecretKey secretKey = keyGenerator.generateKey();       return encryptBASE64(secretKey.getEncoded());   }    /**    * HMAC加密    * @param data    * @param key    * @return    * @throws Exception    */   public static byte[] encryptHMAC(byte[] data, String key) throws Exception {        SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);       Mac mac = Mac.getInstance(secretKey.getAlgorithm());       mac.init(secretKey);        return mac.doFinal(data);    }}




原创粉丝点击