java加密解密算法记录

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:05   1412   0
以下内容均摘自我买的书籍《java加密与解密的艺术》作者 梁栋

复制代码 收藏代码
  1. package com.algorithm;
  2. import java.security.Key;
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.PrivateKey;
  7. import java.security.PublicKey;
  8. import java.security.Signature;
  9. import java.security.interfaces.RSAPrivateKey;
  10. import java.security.interfaces.RSAPublicKey;
  11. import java.security.spec.PKCS8EncodedKeySpec;
  12. import java.security.spec.X509EncodedKeySpec;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import javax.crypto.Cipher;
  16. import org.apache.commons.codec.binary.Hex;
  17. /**
  18. * RSA非对称加密算法安全编码组件
  19. * @author Administrator
  20. *
  21. */
  22. public abstract class RSACoder {
  23. //非对称加密密钥算法
  24. public static final String KEY_ALGORITHM="RSA";
  25. //数字签名 签名/验证算法
  26. public static final String SIGNATURE_ALGORRITHM="SHA1withRSA";
  27. //公钥
  28. private static final String PUBLIC_KEY="RSAPublicKey";
  29. //私钥
  30. private static final String PRIVATE_KEY="RSAPrivateKey";
  31. //RSA密钥长度,默认为1024,密钥长度必须是64的倍数,范围在521~65526位之间
  32. private static final int KEY_SIZE=512;
  33. /**
  34. * 私钥解密
  35. * @param data 待解密数据
  36. * @param key 私钥
  37. * @return byte[] 解密数据
  38. * @throws Exception
  39. */
  40. public static byte[] decryptByPrivateKey(byte[] data,byte[]key) throws Exception
  41. {
  42. //取得私钥
  43. PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
  44. KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  45. //生成私钥
  46. PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
  47. //对数据解密
  48. Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
  49. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  50. return cipher.doFinal(data);
  51. }
  52. /**
  53. * 私钥解密
  54. * @param data 待解密数据
  55. * @param key 私钥
  56. * @return byte[] 解密数据
  57. * @throws Exception
  58. */
  59. public static byte[] decryptByPrivateKey(byte[] data,String privateKey) throws Exception
  60. {
  61. return decryptByPrivateKey(data,getKey(privateKey));
  62. }
  63. /**
  64. * 公钥解密
  65. * @param data 待解密数据
  66. * @param key 公钥
  67. * @return byte[] 解密数据
  68. * @throws Exception
  69. */
  70. public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception
  71. {
  72. //取得公钥
  73. X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);
  74. KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  75. //生成公钥
  76. PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);
  77. //对数据解密
  78. Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
  79. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  80. return cipher.doFinal(data);
  81. }
  82. /**
  83. * 公钥解密
  84. * @param data 待解密数据
  85. * @param key 公钥
  86. * @return byte[] 解密数据
  87. * @throws Exception
  88. */
  89. public static byte[] decryptByPublicKey(byte[] data,String publicKey) throws Exception
  90. {
  91. return decryptByPublicKey(data,getKey(publicKey));
  92. }
  93. /**
  94. * 公钥加密
  95. * @param data 待加密数据
  96. * @param key 公钥
  97. * @return byte[] 加密数据
  98. * @throws Exception
  99. */
  100. public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception
  101. {
  102. //取得公钥
  103. X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);
  104. KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  105. PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);
  106. //对数据加密
  107. Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
  108. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  109. return cipher.doFinal(data);
  110. }
  111. /**
  112. * 公钥加密
  113. * @param data 待加密数据
  114. * @param key 公钥
  115. * @return byte[] 加密数据
  116. * @throws Exception
  117. */
  118. public static byte[] encryptByPublicKey(byte[] data,String publicKey) throws Exception
  119. {
  120. return encryptByPublicKey(data,getKey(publicKey));
  121. }
  122. /**
  123. * 私钥加密
  124. * @param data 待加密数据
  125. * @param key 私钥
  126. * @return byte[] 加密数据
  127. * @throws Exception
  128. */
  129. public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception
  130. {
  131. //取得私钥
  132. PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
  133. KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  134. //生成私钥
  135. PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
  136. //对数据加密
  137. Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
  138. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  139. return cipher.doFinal(data);
  140. }
  141. /**
  142. * 私钥加密
  143. * @param data 待加密数据
  144. * @param key 私钥
  145. * @return byte[] 加密数据
  146. * @throws Exception
  147. */
  148. public static byte[] encryptByPrivateKey(byte[] data,String key) throws Exception
  149. {
  150. return encryptByPrivateKey(data,getKey(key));
  151. }
  152. /**
  153. * 取得私钥
  154. * @param keyMap 密钥Map
  155. * @return byte[] 私钥
  156. * @throws Exception
  157. */
  158. public static byte[] getPrivateKey(Map<String,Object> keyMap) throws Exception
  159. {
  160. Key key=(Key)keyMap.get(PRIVATE_KEY);
  161. return key.getEncoded();
  162. }
  163. /**
  164. * 取得公钥
  165. * @param keyMap 密钥Map
  166. * @return byte[] 公钥
  167. * @throws Exception
  168. */
  169. public static byte[] getPublicKey(Map<String,Object> keyMap) throws Exception
  170. {
  171. Key key=(Key)keyMap.get(PUBLIC_KEY);
  172. return key.getEncoded();
  173. }
  174. /**
  175. * 初始化密钥
  176. * @return 密钥Map
  177. * @throws Exception
  178. */
  179. public static Map<String,Object> initKey() throws Exception
  180. {
  181. //实例化实钥对生成器
  182. KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance(KEY_ALGORITHM);
  183. //初始化密钥对生成器
  184. keyPairGen.initialize(KEY_SIZE);
  185. //生成密钥对
  186. KeyPair keyPair=keyPairGen.generateKeyPair();
  187. //公钥
  188. RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic();
  189. //私钥
  190. RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();
  191. //封装密钥
  192. Map<String,Object> keyMap=new HashMap<String,Object>(2);
  193. keyMap.put(PUBLIC_KEY, publicKey);
  194. keyMap.put(PRIVATE_KEY, privateKey);
  195. return keyMap;
  196. }
  197. /**
  198. * 签名
  199. * @param data 待签名数据
  200. * @param privateKey 私钥
  201. * @return byte[] 数字签名
  202. * @throws Exception
  203. */
  204. public static byte[] sign(byte[] data,byte[] privateKey) throws Exception
  205. {
  206. //转接私钥材料
  207. PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(privateKey);
  208. //实例化密钥工厂
  209. KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  210. //取私钥对象
  211. PrivateKey priKey=keyFactory.generatePrivate(pkcs8KeySpec);
  212. //实例化Signature
  213. Signature signature=Signature.getInstance(SIGNATURE_ALGORRITHM);
  214. //初始化Signature
  215. signature.initSign(priKey);
  216. //更新
  217. signature.update(data);
  218. //签名
  219. return signature.sign();
  220. }
  221. /**
  222. * 公钥校验
  223. * @param data 待校验数据
  224. * @param publicKey 公钥
  225. * @param sign 数字签名
  226. * @return
  227. * @throws Exception
  228. */
  229. public static boolean verify(byte[] data,byte[] publicKey,byte[] sign) throws Exception
  230. {
  231. //转接公钥材料
  232. X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(publicKey);
  233. //实例化密钥工厂
  234. KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
  235. //生成公钥
  236. PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);
  237. //实例化Signature
  238. Signature signature=Signature.getInstance(SIGNATURE_ALGORRITHM);
  239. //初始化Signature
  240. signature.initVerify(pubKey);
  241. //更新
  242. signature.update(data);
  243. //验证
  244. return signature.verify(sign);
  245. }
  246. /**
  247. * 私钥签名
  248. * @param data 待签名数据
  249. * @param privateKey 私钥
  250. * @return String 十六进制签名字符串
  251. * @throws Exception
  252. */
  253. public static String sign(byte[] data,String privateKey) throws Exception
  254. {
  255. byte[] sign=sign(data,getKey(privateKey));
  256. return Hex.encodeHexString(sign);
  257. }
  258. /**
  259. * 公钥校验
  260. * @param data 待验证数据
  261. * @param publicKey 公钥
  262. * @param sign 签名
  263. * @return boolean 成功返回true,失败返回false
  264. * @throws Exception
  265. */
  266. public static boolean verify(byte[] data,String publicKey,String sign) throws Exception
  267. {
  268. return verify(data,getKey(publicKey),Hex.decodeHex(sign.toCharArray()));
  269. }
  270. /**
  271. * 取得私钥十六进制表示形式
  272. * @param keyMap 密钥Map
  273. * @return String 私钥十六进制字符串
  274. * @throws Exception
  275. */
  276. public static String getPrivateKeyString(Map<String,Object> keyMap) throws Exception
  277. {
  278. return Hex.encodeHexString(getPrivateKey(keyMap));
  279. }
  280. /**
  281. * 取得公钥十六进制表示形式
  282. * @param keyMap 密钥Map
  283. * @return String 公钥十六进制字符串
  284. * @throws Exception
  285. */
  286. public static String getPublicKeyString(Map<String,Object> keyMap) throws Exception
  287. {
  288. return Hex.encodeHexString(getPublicKey(keyMap));
  289. }
  290. /**
  291. * 获取密钥
  292. * @param key 密钥
  293. * @return byte[] 密钥
  294. * @throws Exception
  295. */
  296. public static byte[] getKey(String key) throws Exception
  297. {
  298. return Hex.decodeHex(key.toCharArray());
  299. }
  300. }
    package com.algorithm;  
      
    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;  
      
    import org.apache.commons.codec.binary.Hex;  
      
    /** 
    * RSA非对称加密算法安全编码组件 
    * @author Administrator 
    * 
    */  
    public abstract class RSACoder {  
       //非对称加密密钥算法  
       public static final String KEY_ALGORITHM="RSA";  
       //数字签名 签名/验证算法  
       public static final String SIGNATURE_ALGORRITHM="SHA1withRSA";  
       //公钥  
       private static final String PUBLIC_KEY="RSAPublicKey";  
       //私钥  
       private static final String PRIVATE_KEY="RSAPrivateKey";  
       //RSA密钥长度,默认为1024,密钥长度必须是64的倍数,范围在521~65526位之间  
       private static final int KEY_SIZE=512;  
       /** 
        * 私钥解密 
        * @param data 待解密数据 
        * @param key 私钥 
        * @return byte[] 解密数据 
        * @throws Exception 
        */  
       public static byte[] decryptByPrivateKey(byte[] data,byte[]key) throws Exception  
       {  
       //取得私钥  
       PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);  
       KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);  
       //生成私钥  
       PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);  
       //对数据解密  
       Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());  
       cipher.init(Cipher.DECRYPT_MODE, privateKey);  
       return cipher.doFinal(data);  
       }  
       /** 
        * 私钥解密 
        * @param data 待解密数据 
        * @param key 私钥 
        * @return byte[] 解密数据 
        * @throws Exception 
        */  
       public static byte[] decryptByPrivateKey(byte[] data,String privateKey) throws Exception  
       {  
       return decryptByPrivateKey(data,getKey(privateKey));  
       }  
       /** 
        * 公钥解密 
        * @param data 待解密数据 
        * @param key 公钥 
        * @return byte[] 解密数据 
        * @throws Exception 
        */  
       public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception  
       {  
       //取得公钥  
       X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);  
       KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);  
       //生成公钥  
       PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);  
       //对数据解密  
       Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());  
       cipher.init(Cipher.DECRYPT_MODE, publicKey);  
       return cipher.doFinal(data);  
       }  
       /** 
        * 公钥解密 
        * @param data 待解密数据 
        * @param key 公钥 
        * @return byte[] 解密数据 
        * @throws Exception 
        */  
       public static byte[] decryptByPublicKey(byte[] data,String publicKey) throws Exception  
       {  
       return decryptByPublicKey(data,getKey(publicKey));  
       }  
       /** 
        * 公钥加密 
        * @param data 待加密数据 
        * @param key 公钥 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception  
       {  
       //取得公钥  
       X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);  
       KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);  
       PublicKey publicKey=keyFactory.generatePublic(x509KeySpec);  
      //对数据加密  
       Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());  
       cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
       return cipher.doFinal(data);  
       }  
       /** 
        * 公钥加密 
        * @param data 待加密数据 
        * @param key 公钥 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] encryptByPublicKey(byte[] data,String publicKey) throws Exception  
       {  
       return encryptByPublicKey(data,getKey(publicKey));  
       }  
       /** 
        * 私钥加密 
        * @param data 待加密数据 
        * @param key 私钥 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception  
       {  
       //取得私钥  
       PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);  
       KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);  
       //生成私钥  
       PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);  
       //对数据加密  
       Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());  
       cipher.init(Cipher.ENCRYPT_MODE, privateKey);  
       return cipher.doFinal(data);  
       }  
       /** 
        * 私钥加密 
        * @param data 待加密数据 
        * @param key 私钥 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] encryptByPrivateKey(byte[] data,String key) throws Exception  
       {  
       return encryptByPrivateKey(data,getKey(key));  
       }  
       /** 
        * 取得私钥 
        * @param keyMap 密钥Map 
        * @return byte[] 私钥 
        * @throws Exception 
        */  
       public static byte[] getPrivateKey(Map<String,Object> keyMap) throws Exception  
       {  
       Key key=(Key)keyMap.get(PRIVATE_KEY);  
       return key.getEncoded();  
       }  
       /** 
        * 取得公钥 
        * @param keyMap 密钥Map 
        * @return byte[] 公钥 
        * @throws Exception 
        */  
       public static byte[] getPublicKey(Map<String,Object> keyMap) throws Exception  
       {  
       Key key=(Key)keyMap.get(PUBLIC_KEY);  
       return key.getEncoded();  
       }  
       /** 
        * 初始化密钥 
        * @return 密钥Map 
        * @throws Exception 
        */  
       public static Map<String,Object> initKey() throws Exception  
       {  
       //实例化实钥对生成器  
       KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance(KEY_ALGORITHM);  
       //初始化密钥对生成器  
       keyPairGen.initialize(KEY_SIZE);  
       //生成密钥对  
       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;  
       }  
       /** 
        * 签名 
        * @param data 待签名数据 
        * @param privateKey 私钥 
        * @return byte[] 数字签名 
        * @throws Exception 
        */  
       public static byte[] sign(byte[] data,byte[] privateKey) throws Exception  
       {  
       //转接私钥材料  
       PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(privateKey);  
       //实例化密钥工厂  
       KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);  
       //取私钥对象  
       PrivateKey priKey=keyFactory.generatePrivate(pkcs8KeySpec);  
       //实例化Signature  
       Signature signature=Signature.getInstance(SIGNATURE_ALGORRITHM);  
       //初始化Signature  
       signature.initSign(priKey);  
       //更新  
       signature.update(data);  
       //签名  
       return signature.sign();  
       }  
       /** 
        * 公钥校验 
        * @param data 待校验数据 
        * @param publicKey 公钥 
        * @param sign 数字签名 
        * @return 
        * @throws Exception 
        */  
       public static boolean verify(byte[] data,byte[] publicKey,byte[] sign) throws Exception  
       {  
       //转接公钥材料  
       X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(publicKey);  
       //实例化密钥工厂  
       KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);  
       //生成公钥  
       PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);  
       //实例化Signature  
       Signature signature=Signature.getInstance(SIGNATURE_ALGORRITHM);  
       //初始化Signature  
       signature.initVerify(pubKey);  
       //更新  
       signature.update(data);  
       //验证  
       return signature.verify(sign);  
       }  
       /** 
        * 私钥签名 
        * @param data 待签名数据 
        * @param privateKey 私钥 
        * @return String 十六进制签名字符串 
        * @throws Exception 
        */  
       public static String sign(byte[] data,String privateKey) throws Exception  
       {  
       byte[] sign=sign(data,getKey(privateKey));  
       return Hex.encodeHexString(sign);  
       }  
       /** 
        * 公钥校验 
        * @param data 待验证数据 
        * @param publicKey 公钥 
        * @param sign 签名 
        * @return boolean 成功返回true,失败返回false 
        * @throws Exception 
        */  
       public static boolean verify(byte[] data,String publicKey,String sign) throws Exception  
       {  
       return verify(data,getKey(publicKey),Hex.decodeHex(sign.toCharArray()));  
       }  
      
       /** 
        * 取得私钥十六进制表示形式 
        * @param keyMap 密钥Map 
        * @return String 私钥十六进制字符串 
        * @throws Exception 
        */  
       public static String getPrivateKeyString(Map<String,Object> keyMap) throws Exception  
       {  
       return Hex.encodeHexString(getPrivateKey(keyMap));  
       }  
       /** 
        * 取得公钥十六进制表示形式 
        * @param keyMap 密钥Map 
        * @return String 公钥十六进制字符串 
        * @throws Exception 
        */  
       public static String getPublicKeyString(Map<String,Object> keyMap) throws Exception  
       {  
       return Hex.encodeHexString(getPublicKey(keyMap));  
       }  
       /** 
        * 获取密钥 
        * @param key 密钥 
        * @return byte[] 密钥 
        * @throws Exception 
        */  
       public static byte[] getKey(String key) throws Exception  
       {  
       return Hex.decodeHex(key.toCharArray());  
       }  
    }  
 




Java代码 复制代码 收藏代码
  1. package com.algorithm;
  2. import java.util.Map;
  3. import org.apache.commons.codec.binary.Base64;
  4. /**
  5. * RSA算法测试用例
  6. * @author Administrator
  7. *
  8. */
  9. public class RSACoderTest {
  10. //公钥
  11. private static byte[] publicKey;
  12. //私钥
  13. private static byte[] privateKey;
  14. /**
  15. * 初始化密钥
  16. * @throws Exception
  17. */
  18. public static void initKey() throws Exception
  19. {
  20. //初始化密钥
  21. Map<String,Object> keyMap=RSACoder.initKey();
  22. publicKey=RSACoder.getPublicKey(keyMap);
  23. privateKey=RSACoder.getPrivateKey(keyMap);
  24. System.out.println("公钥:"+Base64.encodeBase64String(publicKey));
  25. System.out.println("私钥:"+Base64.encodeBase64String(privateKey));
  26. }
  27. public static void test() throws Exception
  28. {
  29. String inputStr="RSA加密算法,私钥加密,公钥解密";
  30. byte[] data=inputStr.getBytes();
  31. //私钥加密
  32. byte[] enCodeData=RSACoder.encryptByPrivateKey(data,privateKey);
  33. System.out.println("加密字符串:"+Base64.encodeBase64String(enCodeData));
  34. //公钥解密
  35. byte[] deCodeData=RSACoder.decryptByPublicKey(enCodeData, publicKey);
  36. System.out.println(new String(deCodeData).equals(inputStr));
  37. }
  38. /**
  39. * @param args
  40. * @throws Exception
  41. */
  42. public static void main(String[] args) throws Exception {
  43. // TODO Auto-generated method stub
  44. initKey();
  45. RSACoderTest.test();
  46. }
  47. }
    package com.algorithm;  
      
    import java.util.Map;  
      
    import org.apache.commons.codec.binary.Base64;  
      
    /** 
     * RSA算法测试用例 
     * @author Administrator 
     * 
     */  
    public class RSACoderTest {  
        //公钥  
        private static byte[] publicKey;  
        //私钥  
        private static byte[] privateKey;  
        /** 
         * 初始化密钥 
         * @throws Exception 
         */  
        public static void initKey() throws Exception  
        {  
            //初始化密钥  
            Map<String,Object> keyMap=RSACoder.initKey();  
            publicKey=RSACoder.getPublicKey(keyMap);  
            privateKey=RSACoder.getPrivateKey(keyMap);  
            System.out.println("公钥:"+Base64.encodeBase64String(publicKey));  
            System.out.println("私钥:"+Base64.encodeBase64String(privateKey));  
        }  
        public static void test() throws Exception  
        {  
            String inputStr="RSA加密算法,私钥加密,公钥解密";  
            byte[] data=inputStr.getBytes();  
            //私钥加密  
            byte[] enCodeData=RSACoder.encryptByPrivateKey(data,privateKey);  
            System.out.println("加密字符串:"+Base64.encodeBase64String(enCodeData));  
            //公钥解密  
            byte[] deCodeData=RSACoder.decryptByPublicKey(enCodeData, publicKey);  
            System.out.println(new String(deCodeData).equals(inputStr));  
        }  
        /** 
         * @param args 
         * @throws Exception  
         */  
        public static void main(String[] args) throws Exception {  
             // TODO Auto-generated method stub  
             initKey();  
             RSACoderTest.test();  
        }  
      
    }  
    



Java代码 复制代码 收藏代码
  1. package com.algorithm;
  2. import java.io.FileInputStream;
  3. import java.security.KeyStore;
  4. import java.security.PrivateKey;
  5. import java.security.PublicKey;
  6. import java.security.Signature;
  7. import java.security.cert.Certificate;
  8. import java.security.cert.CertificateFactory;
  9. import java.security.cert.X509Certificate;
  10. import javax.crypto.Cipher;
  11. /**
  12. * 证书组件
  13. * @author Administrator
  14. */
  15. public abstract class CertificateCoder {
  16. //类型证书
  17. private static final String CERT_TYPE="X.509";
  18. /**
  19. * 由KeyStore获得私钥
  20. * @param keyStorePath 密钥库路径
  21. * @param alias 别名
  22. * @param password 密码
  23. * @return PrivateKey 密钥
  24. * @throws Exception
  25. */
  26. private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,String alias,String password) throws Exception
  27. {
  28. //获得密钥库
  29. KeyStore ks=getKeyStore(keyStorePath,password);
  30. //获得私钥
  31. return (PrivateKey)ks.getKey(alias, password.toCharArray());
  32. }
  33. /**
  34. * 由Certificate获得公钥
  35. * @param certificatePath 证书路径
  36. * @return PublicKey 公钥
  37. */
  38. private static PublicKey getPublicKeyByCertificate(String certificatePath) throws Exception
  39. {
  40. //获得证书
  41. Certificate certificate=getCertificate(certificatePath);
  42. //获得公钥
  43. return certificate.getPublicKey();
  44. }
  45. /**
  46. * 获得certificate
  47. * @param certificatePath 证书路径
  48. * @return Certificate 证书
  49. * @throws Exception
  50. */
  51. private static Certificate getCertificate(String certificatePath) throws Exception
  52. {
  53. //实例化证书工厂
  54. CertificateFactory certificateFactory=CertificateFactory.getInstance(CERT_TYPE);
  55. //取得证书文件流
  56. FileInputStream in=new FileInputStream(certificatePath);
  57. //生成证书
  58. Certificate certificate=certificateFactory.generateCertificate(in);
  59. //关闭证书文件流
  60. in.close();
  61. return certificate;
  62. }
  63. /**
  64. * 取得Certificate
  65. * @param keyStorePath 密钥库路径
  66. * @param alias 别名
  67. * @param password 密码
  68. * @return Certificate 证书
  69. * @throws Exception
  70. */
  71. private static Certificate getCertificate(String keyStorePath,String alias,String password) throws Exception
  72. {
  73. //获得密钥库
  74. KeyStore ks=getKeyStore(keyStorePath,password);
  75. //获得证书
  76. return ks.getCertificate(alias);
  77. }
  78. /**
  79. * 获得密钥库
  80. * @param keyStorePath 密钥库路径
  81. * @param password 密码
  82. * @return KeyStore 密钥库
  83. * @throws Exception
  84. */
  85. private static KeyStore getKeyStore(String keyStorePath,String password) throws Exception
  86. {
  87. //实例化密钥库
  88. KeyStore ks=KeyStore.getInstance(KeyStore.getDefaultType());
  89. //获得密钥库文件流
  90. FileInputStream in=new FileInputStream(keyStorePath);
  91. //加载密钥库
  92. ks.load(in, password.toCharArray());
  93. //关闭密钥库文件流
  94. in.close();
  95. return ks;
  96. }
  97. /**
  98. * 私钥加密
  99. * @param data 待加密数据
  100. * @param keyStorePath 密钥库路径
  101. * @param alias 别名
  102. * @param password 密码
  103. * @return byte[] 加密数据
  104. * @throws Exception
  105. */
  106. public static byte[] encryptByPrivateKey(byte[] data,String keyStorePath,String alias,String password) throws Exception
  107. {
  108. //取得私钥
  109. PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath,alias,password);
  110. //对数据加密
  111. Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());
  112. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  113. return cipher.doFinal(data);
  114. }
  115. /**
  116. * 私钥解密
  117. * @param data 待解密数据
  118. * @param keyStorePath 密钥库路径
  119. * @param alias 别名
  120. * @param password 密码
  121. * @return byte[] 加密数据
  122. * @throws Exception
  123. */
  124. public static byte[] decryptByPrivateKey(byte[] data,String keyStorePath,String alias,String password) throws Exception
  125. {
  126. //取得私钥
  127. PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath,alias,password);
  128. //对数据解密
  129. Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());
  130. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  131. return cipher.doFinal(data);
  132. }
  133. /**
  134. * 公钥加密
  135. * @param data 待加密数据
  136. * @param certificatePath 证书路径
  137. * @return byte[] 加密数据
  138. * @throws Exception
  139. */
  140. public static byte[] encryptByPublicKey(byte[] data,String certificatePath) throws Exception
  141. {
  142. //取得公钥
  143. PublicKey publicKey=getPublicKeyByCertificate(certificatePath);
  144. //对数据加密
  145. Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());
  146. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  147. return cipher.doFinal(data);
  148. }
  149. /**
  150. * 公钥解密
  151. * @param data 待解密数据
  152. * @param certificatePath 证书路径
  153. * @return byte[] 解密数据
  154. * @throws Exception
  155. */
  156. public static byte[] decryptByPublicKey(byte[] data,String certificatePath) throws Exception
  157. {
  158. //取得公钥
  159. PublicKey publicKey=getPublicKeyByCertificate(certificatePath);
  160. //对数据解密
  161. Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());
  162. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  163. return cipher.doFinal(data);
  164. }
  165. /**
  166. * 签名
  167. * @param data 待签名数据
  168. * @param keyStorePath 密钥库路径
  169. * @param alias 别名
  170. * @param password 密码
  171. * @return byte[] 签名
  172. * @throws Exception
  173. */
  174. public static byte[] sign(byte[] data,String keyStorePath,String alias,String password) throws Exception
  175. {
  176. //获得证书
  177. X509Certificate x509Certificate=(X509Certificate)getCertificate(keyStorePath,alias,password);
  178. //构建签名,由证书指定签名算法
  179. Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());
  180. //获取私钥
  181. PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath, alias, password);
  182. //初始化签名,由私钥构建
  183. signature.initSign(privateKey);
  184. signature.update(data);
  185. return signature.sign();
  186. }
  187. /**
  188. * 签名验证
  189. * @param data 数据
  190. * @param sign 签名
  191. * @param certificatePath 证书路径
  192. * @return boolean 验证通过为true
  193. * @throws Exception
  194. */
  195. public static boolean verify(byte[] data,byte[] sign,String certificatePath) throws Exception
  196. {
  197. //获得证书
  198. X509Certificate x509Certificate=(X509Certificate)getCertificate(certificatePath);
  199. //构建签名,由证书指定签名算法
  200. Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());
  201. //由证书初始化签名,实际上是使用了证书中的公钥
  202. signature.initVerify(x509Certificate);
  203. signature.update(data);
  204. return signature.verify(sign);
  205. }
  206. }
    package com.algorithm;  
      
    import java.io.FileInputStream;  
    import java.security.KeyStore;  
    import java.security.PrivateKey;  
    import java.security.PublicKey;  
    import java.security.Signature;  
    import java.security.cert.Certificate;  
    import java.security.cert.CertificateFactory;  
    import java.security.cert.X509Certificate;  
      
    import javax.crypto.Cipher;  
      
    /** 
     * 证书组件 
     * @author Administrator 
     */  
    public abstract class CertificateCoder {  
       //类型证书  
       private static final String CERT_TYPE="X.509";  
       /** 
        * 由KeyStore获得私钥 
        * @param keyStorePath 密钥库路径 
        * @param alias 别名 
        * @param password 密码 
        * @return PrivateKey 密钥 
        * @throws Exception 
        */  
       private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath,String alias,String password) throws Exception  
       {  
           //获得密钥库  
           KeyStore ks=getKeyStore(keyStorePath,password);  
           //获得私钥  
           return (PrivateKey)ks.getKey(alias, password.toCharArray());  
       }  
       /** 
        * 由Certificate获得公钥 
        * @param certificatePath 证书路径 
        * @return PublicKey 公钥 
        */  
       private static PublicKey getPublicKeyByCertificate(String certificatePath) throws Exception  
       {  
           //获得证书  
           Certificate certificate=getCertificate(certificatePath);  
           //获得公钥  
           return certificate.getPublicKey();  
       }  
       /** 
        * 获得certificate 
        * @param certificatePath 证书路径 
        * @return Certificate 证书 
        * @throws Exception 
        */  
       private static Certificate getCertificate(String certificatePath) throws Exception  
       {  
           //实例化证书工厂  
           CertificateFactory certificateFactory=CertificateFactory.getInstance(CERT_TYPE);  
           //取得证书文件流  
           FileInputStream in=new FileInputStream(certificatePath);  
           //生成证书  
           Certificate certificate=certificateFactory.generateCertificate(in);  
           //关闭证书文件流  
           in.close();  
           return certificate;  
       }  
       /** 
        * 取得Certificate 
        * @param keyStorePath 密钥库路径 
        * @param alias 别名 
        * @param password 密码 
        * @return Certificate 证书 
        * @throws Exception 
        */  
       private static Certificate getCertificate(String keyStorePath,String alias,String password) throws Exception  
       {  
           //获得密钥库  
           KeyStore ks=getKeyStore(keyStorePath,password);  
           //获得证书  
           return ks.getCertificate(alias);  
       }  
       /** 
        * 获得密钥库 
        * @param keyStorePath 密钥库路径 
        * @param password 密码 
        * @return KeyStore 密钥库 
        * @throws Exception 
        */  
       private static KeyStore getKeyStore(String keyStorePath,String password) throws Exception  
       {  
           //实例化密钥库  
           KeyStore ks=KeyStore.getInstance(KeyStore.getDefaultType());  
           //获得密钥库文件流  
           FileInputStream in=new FileInputStream(keyStorePath);  
           //加载密钥库  
           ks.load(in, password.toCharArray());  
           //关闭密钥库文件流  
           in.close();  
           return ks;  
       }  
       /** 
        * 私钥加密 
        * @param data 待加密数据 
        * @param keyStorePath 密钥库路径 
        * @param alias 别名 
        * @param password 密码 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] encryptByPrivateKey(byte[] data,String keyStorePath,String alias,String password) throws Exception  
       {  
           //取得私钥  
           PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath,alias,password);  
           //对数据加密  
           Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());  
           cipher.init(Cipher.ENCRYPT_MODE, privateKey);  
           return cipher.doFinal(data);  
       }  
       /** 
        * 私钥解密 
        * @param data 待解密数据 
        * @param keyStorePath 密钥库路径 
        * @param alias 别名 
        * @param password 密码 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] decryptByPrivateKey(byte[] data,String keyStorePath,String alias,String password) throws Exception  
       {  
           //取得私钥  
           PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath,alias,password);  
           //对数据解密  
           Cipher cipher=Cipher.getInstance(privateKey.getAlgorithm());  
           cipher.init(Cipher.DECRYPT_MODE, privateKey);  
           return cipher.doFinal(data);  
       }  
       /** 
        * 公钥加密 
        * @param data 待加密数据 
        * @param certificatePath 证书路径 
        * @return byte[] 加密数据 
        * @throws Exception 
        */  
       public static byte[] encryptByPublicKey(byte[] data,String certificatePath) throws Exception  
       {  
           //取得公钥  
           PublicKey publicKey=getPublicKeyByCertificate(certificatePath);  
           //对数据加密  
           Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());  
           cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
           return cipher.doFinal(data);  
       }  
       /** 
        * 公钥解密 
        * @param data 待解密数据 
        * @param certificatePath 证书路径 
        * @return byte[] 解密数据 
        * @throws Exception 
        */  
       public static byte[] decryptByPublicKey(byte[] data,String certificatePath) throws Exception  
       {  
           //取得公钥  
           PublicKey publicKey=getPublicKeyByCertificate(certificatePath);  
           //对数据解密  
           Cipher cipher=Cipher.getInstance(publicKey.getAlgorithm());  
           cipher.init(Cipher.DECRYPT_MODE, publicKey);  
           return cipher.doFinal(data);  
       }  
       /** 
        * 签名 
        * @param data 待签名数据 
        * @param keyStorePath 密钥库路径 
        * @param alias 别名 
        * @param password 密码 
        * @return byte[] 签名 
        * @throws Exception 
        */  
       public static byte[] sign(byte[] data,String keyStorePath,String alias,String password) throws Exception  
       {  
           //获得证书  
           X509Certificate x509Certificate=(X509Certificate)getCertificate(keyStorePath,alias,password);  
           //构建签名,由证书指定签名算法  
           Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());  
           //获取私钥  
           PrivateKey privateKey=getPrivateKeyByKeyStore(keyStorePath, alias, password);  
           //初始化签名,由私钥构建  
           signature.initSign(privateKey);  
           signature.update(data);  
           return signature.sign();  
       }  
       /** 
        * 签名验证 
        * @param data 数据 
        * @param sign 签名 
        * @param certificatePath 证书路径 
        * @return boolean 验证通过为true 
        * @throws Exception 
        */  
       public static boolean verify(byte[] data,byte[] sign,String certificatePath) throws Exception  
       {  
           //获得证书  
           X509Certificate x509Certificate=(X509Certificate)getCertificate(certificatePath);  
           //构建签名,由证书指定签名算法  
           Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());  
           //由证书初始化签名,实际上是使用了证书中的公钥  
           signature.initVerify(x509Certificate);  
           signature.update(data);  
           return signature.verify(sign);  
       }  
    }  
    



Java代码 复制代码 收藏代码
  1. package com.algorithm;
  2. import java.io.InputStream;
  3. import org.apache.commons.codec.binary.Hex;
  4. /**
  5. * 数字证书测试用例
  6. * @author Administrator
  7. *
  8. */
  9. public class CertificateCoderTest {
  10. //生成证书时的密码
  11. private static String password="123456";
  12. //别名
  13. private static String alias="www.dominic.com";
  14. //证书路径
  15. private static String certificatePath="D:\\Program Files\\OpenSSL-Win32\\ca\\certs\\dominic.cer";
  16. //密钥库路径
  17. private static String keyStorePath="D:\\Program Files\\OpenSSL-Win32\\ca\\certs\\domini.keystore";
  18. /**
  19. * 公钥加密私钥解密
  20. */
  21. public static void test1() throws Exception
  22. {
  23. String inputStr="数字证书";
  24. byte[] data=inputStr.getBytes();
  25. //公钥加密
  26. byte[] encrypt=CertificateCoder.encryptByPublicKey(data, certificatePath);
  27. //私钥解密
  28. byte[] decrypt=CertificateCoder.decryptByPrivateKey(encrypt, keyStorePath, alias, password);
  29. System.out.println(new String(decrypt).equals(inputStr));
  30. }
  31. /**
  32. * 私加密公钥解密
  33. */
  34. public static void test2() throws Exception
  35. {
  36. String inputStr="数字证书";
  37. byte[] data=inputStr.getBytes();
  38. //私钥加密
  39. byte[] encrypt=CertificateCoder.encryptByPrivateKey(data, keyStorePath, alias, password);
  40. //公钥解密
  41. byte[] decrypt=CertificateCoder.decryptByPublicKey(encrypt, certificatePath);
  42. System.out.println(new String(decrypt).equals(inputStr));
  43. }
  44. /**
  45. * 签名验证
  46. */
  47. public static void test3() throws Exception
  48. {
  49. String inputStr="数字签名";
  50. byte[] data=inputStr.getBytes();
  51. //私钥签名
  52. byte[] sign=CertificateCoder.sign(data, keyStorePath, alias, password);
  53. System.out.println("签名:"+Hex.encodeHexString(sign));
  54. //公钥验证
  55. System.out.println(CertificateCoder.verify(data, sign, certificatePath));
  56. }
  57. public static void main(String[] args) throws Exception
  58. {
  59. CertificateCoderTest.test1();
  60. CertificateCoderTest.test2();
  61. CertificateCoderTest.test3();
  62. }
  63. }
package com.algorithm;  
      
    import java.io.InputStream;  
      
    import org.apache.commons.codec.binary.Hex;  
      
    /** 
     * 数字证书测试用例 
     * @author Administrator 
     * 
     */  
    public class CertificateCoderTest {  
        //生成证书时的密码  
        private static String password="123456";  
        //别名  
        private static String alias="www.dominic.com";  
        //证书路径  
        private static String certificatePath="D:\\Program Files\\OpenSSL-Win32\\ca\\certs\\dominic.cer";  
        //密钥库路径  
        private static String keyStorePath="D:\\Program Files\\OpenSSL-Win32\\ca\\certs\\domini.keystore";  
        /** 
         * 公钥加密私钥解密 
         */  
        public static void test1() throws Exception  
        {  
            String inputStr="数字证书";  
            byte[] data=inputStr.getBytes();  
            //公钥加密  
            byte[] encrypt=CertificateCoder.encryptByPublicKey(data, certificatePath);  
            //私钥解密  
            byte[] decrypt=CertificateCoder.decryptByPrivateKey(encrypt, keyStorePath, alias, password);  
            System.out.println(new String(decrypt).equals(inputStr));  
        }  
        /** 
         * 私加密公钥解密 
         */  
        public static void test2() throws Exception  
        {  
            String inputStr="数字证书";  
            byte[] data=inputStr.getBytes();  
            //私钥加密  
            byte[] encrypt=CertificateCoder.encryptByPrivateKey(data, keyStorePath, alias, password);  
            //公钥解密  
            byte[] decrypt=CertificateCoder.decryptByPublicKey(encrypt, certificatePath);  
            System.out.println(new String(decrypt).equals(inputStr));  
        }  
        /** 
         * 签名验证 
         */  
        public static void test3() throws Exception  
        {  
            String inputStr="数字签名";  
            byte[] data=inputStr.getBytes();  
            //私钥签名  
            byte[] sign=CertificateCoder.sign(data, keyStorePath, alias, password);  
            System.out.println("签名:"+Hex.encodeHexString(sign));  
            //公钥验证  
            System.out.println(CertificateCoder.verify(data, sign, certificatePath));  
        }  
        public static void main(String[] args) throws Exception  
        {  
            CertificateCoderTest.test1();  
            CertificateCoderTest.test2();  
            CertificateCoderTest.test3();  
        }  
    }  
 



Java代码 复制代码 收藏代码
  1. package com.algorithm;
  2. import java.security.Key;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.KeyGenerator;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.spec.SecretKeySpec;
  7. import org.apache.commons.codec.binary.Base64;
  8. import org.apache.commons.codec.digest.DigestUtils;
  9. /**
  10. * AES对称加密算法,组件类
  11. * @author Administrator
  12. *
  13. */
  14. public abstract class AESCoder {
  15. //密钥算法
  16. public static final String ALGORITHM="AES";
  17. //密钥长度(java默认只能处理128位以内的长度,如果需要处理大于128位可以使用JCE解除密钥长度限制)
  18. public static final int KEY_SIZE=128;
  19. /**
  20. * 转换密钥
  21. * @param key 二进制密钥
  22. * @return Key 密钥
  23. * @throws Exception
  24. */
  25. private static Key toKey(byte[] key) throws Exception
  26. {
  27. //实例化AES密钥材料
  28. SecretKey secretKey=new SecretKeySpec(key,ALGORITHM);
  29. return secretKey;
  30. }
  31. /**
  32. * 解密
  33. * @param data 待解密数据
  34. * @param key 密钥
  35. * @return byte[] 解密数据
  36. * @throws Exception
  37. */
  38. public static byte[] decrypt(byte[] data,byte[] key) throws Exception
  39. {
  40. //还原密钥
  41. Key k=toKey(key);
  42. //实例化
  43. Cipher cipher=Cipher.getInstance(ALGORITHM);
  44. //初始化,设置为解密模式
  45. cipher.init(Cipher.DECRYPT_MODE, k);
  46. //执行操作
  47. return cipher.doFinal(data);
  48. }
  49. /**
  50. * 解密
  51. * @param data 待解密数据
  52. * @param key 密钥
  53. * @return byte[] 解密数据
  54. * @throws Exception
  55. */
  56. public static byte[] decrypt(byte[] data,String key) throws Exception
  57. {
  58. return decrypt(data,getKey(key));
  59. }
  60. /**
  61. * 加密
  62. * @param data 待加密数据
  63. * @param key 密钥
  64. * @return byte[] 加密数据
  65. * @throws Exception
  66. */
  67. public static byte[] encrypt(byte[] data,byte[] key) throws Exception
  68. {
  69. //还原密钥
  70. Key k=toKey(key);
  71. //实例化
  72. Cipher cipher=Cipher.getInstance(ALGORITHM);
  73. //初始化,设置为加密模式
  74. cipher.init(Cipher.ENCRYPT_MODE, k);
  75. //执行操作
  76. return cipher.doFinal(data);
  77. }
  78. /**
  79. * 加密
  80. * @param data 待加密数据
  81. * @param key 密钥
  82. * @return byte[] 加密数据
  83. * @throws Exception
  84. */
  85. public static byte[] encrypt(byte[] data,String key) throws Exception
  86. {
  87. return encrypt(data,getKey(key));
  88. }
  89. /**
  90. * 生成密钥
  91. * @return byte[] 二进制密钥
  92. * @throws Exception
  93. */
  94. public static byte[] initKey() throws Exception
  95. {
  96. //实例化
  97. KeyGenerator kg=KeyGenerator.getInstance(ALGORITHM);
  98. //初始化密钥长度
  99. kg.init(KEY_SIZE);
  100. //生成秘密密钥
  101. SecretKey secretKey=kg.generateKey();
  102. //获得密钥的二进制编码形式
  103. return secretKey.getEncoded();
  104. }
  105. /**
  106. * 初始化密钥
  107. * @return String Base64编码密钥
  108. * @throws Exception
  109. */
  110. public static String initKeyString() throws Exception
  111. {
  112. return Base64.encodeBase64String(initKey());
  113. }
  114. /**
  115. * 获取密钥
  116. * @param key
  117. * @return byte[] 密钥
  118. * @throws Exception
  119. */
  120. public static byte[] getKey(String key) throws Exception
  121. {
  122. return Base64.decodeBase64(key);
  123. }
  124. /**
  125. * 摘要处理
  126. * @param data 待摘要数据
  127. * @return String 摘要字符串
  128. */
  129. public static String shaHex(byte[] data)
  130. {
  131. return DigestUtils.md5Hex(data);
  132. }
  133. /**
  134. * 验证
  135. * @param data 待摘要数据
  136. * @param messageDigest 摘要字符串
  137. * @return 验证结果
  138. */
  139. public static boolean validate(byte[] data,String messageDigest)
  140. {
  141. return messageDigest.equals(shaHex(data));
  142. }
  143. }
   
    package com.algorithm;  
      
    import java.security.Key;  
      
    import javax.crypto.Cipher;  
    import javax.crypto.KeyGenerator;  
    import javax.crypto.SecretKey;  
    import javax.crypto.spec.SecretKeySpec;  
      
    import org.apache.commons.codec.binary.Base64;  
    import org.apache.commons.codec.digest.DigestUtils;  
    /** 
     * AES对称加密算法,组件类 
     * @author Administrator 
     * 
     */  
    public abstract class AESCoder {  
      //密钥算法  
      public static final String ALGORITHM="AES";  
      //密钥长度(java默认只能处理128位以内的长度,如果需要处理大于128位可以使用JCE解除密钥长度限制)  
      public static final int KEY_SIZE=128;  
      /** 
       * 转换密钥 
       * @param key 二进制密钥 
       * @return Key 密钥 
       * @throws Exception 
       */  
      private static Key toKey(byte[] key) throws Exception   
      {  
          //实例化AES密钥材料  
          SecretKey secretKey=new SecretKeySpec(key,ALGORITHM);  
          return secretKey;  
      }  
      /** 
       * 解密 
       * @param data 待解密数据 
       * @param key 密钥 
       * @return byte[] 解密数据 
       * @throws Exception 
       */  
      public static byte[] decrypt(byte[] data,byte[] key) throws Exception   
      {  
          //还原密钥  
          Key k=toKey(key);  
          //实例化  
          Cipher cipher=Cipher.getInstance(ALGORITHM);  
          //初始化,设置为解密模式  
          cipher.init(Cipher.DECRYPT_MODE, k);  
          //执行操作  
          return cipher.doFinal(data);  
      }  
      /** 
       * 解密 
       * @param data 待解密数据 
       * @param key 密钥 
       * @return byte[] 解密数据 
       * @throws Exception 
       */  
      public static byte[] decrypt(byte[] data,String key) throws Exception   
      {  
          return decrypt(data,getKey(key));  
      }  
      /** 
       * 加密 
       * @param data 待加密数据 
       * @param key 密钥 
       * @return byte[] 加密数据 
       * @throws Exception 
       */  
      public static byte[] encrypt(byte[] data,byte[] key) throws Exception   
      {  
          //还原密钥  
          Key k=toKey(key);  
          //实例化  
          Cipher cipher=Cipher.getInstance(ALGORITHM);  
          //初始化,设置为加密模式  
          cipher.init(Cipher.ENCRYPT_MODE, k);  
          //执行操作  
          return cipher.doFinal(data);  
      }  
      /** 
       * 加密 
       * @param data 待加密数据 
       * @param key 密钥 
       * @return byte[] 加密数据 
       * @throws Exception 
       */  
      public static byte[] encrypt(byte[] data,String key) throws Exception   
      {  
          return encrypt(data,getKey(key));  
      }  
      /** 
       * 生成密钥 
       * @return byte[] 二进制密钥 
       * @throws Exception 
       */  
      public static byte[] initKey() throws Exception   
      {  
          //实例化  
          KeyGenerator kg=KeyGenerator.getInstance(ALGORITHM);  
          //初始化密钥长度  
          kg.init(KEY_SIZE);  
          //生成秘密密钥  
          SecretKey secretKey=kg.generateKey();  
          //获得密钥的二进制编码形式  
          return secretKey.getEncoded();  
      }  
      /** 
       * 初始化密钥 
       * @return String Base64编码密钥 
       * @throws Exception 
       */  
      public static String initKeyString() throws Exception   
      {  
          return Base64.encodeBase64String(initKey());  
      }  
      /** 
       * 获取密钥 
       * @param key 
       * @return byte[] 密钥 
       * @throws Exception 
       */  
      public static byte[] getKey(String key) throws Exception   
      {  
          return Base64.decodeBase64(key);  
      }  
      /** 
       * 摘要处理 
       * @param data 待摘要数据 
       * @return String 摘要字符串 
       */  
      public static String shaHex(byte[] data)  
      {  
          return DigestUtils.md5Hex(data);  
      }  
      /** 
       * 验证 
       * @param data 待摘要数据 
       * @param messageDigest 摘要字符串 
       * @return 验证结果 
       */  
      public static boolean validate(byte[] data,String messageDigest)  
      {  
          return messageDigest.equals(shaHex(data));  
      }  
        
    }  
    


Java代码 复制代码 收藏代码
  1. package com.algorithm;
  2. /**
  3. * 对称加密算法测试用例
  4. * @author Administrator
  5. *
  6. */
  7. public class AESCoderTest {
  8. public static void main(String args[])
  9. {
  10. try {
  11. //初始化密钥
  12. String secretKey=AESCoder.initKeyString();
  13. System.out.println("密钥为:"+secretKey);
  14. String s="我们的大中国";
  15. //加密数据
  16. byte[] encryptData=AESCoder.encrypt(s.getBytes(), secretKey);
  17. //解密数据
  18. byte[] data=AESCoder.decrypt(encryptData, secretKey);
  19. //比较
  20. System.out.println(new String(data).equals(s));
  21. } catch (Exception e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. }
  26. }
 
    package com.algorithm;  
    /** 
     * 对称加密算法测试用例 
     * @author Administrator 
     * 
     */  
    public class AESCoderTest {  
            
          public static void main(String args[])  
          {  
              try {  
                 //初始化密钥  
                 String secretKey=AESCoder.initKeyString();  
                 System.out.println("密钥为:"+secretKey);  
                 String s="我们的大中国";  
                 //加密数据  
                 byte[] encryptData=AESCoder.encrypt(s.getBytes(), secretKey);  
                 //解密数据  
                 byte[] data=AESCoder.decrypt(encryptData, secretKey);  
                 //比较  
                 System.out.println(new String(data).equals(s));  
              } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
          }  
    }




附证书生成命令:
keytool生成证书
keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 360 -alias www.dominic.com -keystore dominic.keystore
导出数字证书
keytool -exportcert -alias www.dominic.com -keystore dominic.keystore -file dominic.cer -rfc
打印数字证书
keytool -printcert -file dominic.cer
这里是自制证书,如果需要权威机构签发,需要导出证书申请文件由第三方签发

openssl证书创建

根证书构建命令?
echo 构建随机数 private/.rand
openssl rand -out private/.rand 1000
echo 构建根证书私钥 private/ca.key.pem
openssl genrsa -aes256 -out private/ca.key.pem 2048
echo 生成根证书签发申请 private/ca.csr
openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=dominic/OU=dominic/CN=www.dominic.com"
echo 签发根证书 private/ca.cer
openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
echo 根证书转换 private/ca.p12
openssl pkcs12 -export -cacerts inkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer

服务器证书构建步骤命令?
(1)echo 构建服务器私钥 private/server.key.pem
(2)openssl genrsa -aes256 -out private/server.key.pem 2048
echo 生成服务器证书签发申请 private/server.csr
(3)openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=BJ/L=BJ/O=dominic/OU=dominic/CN=www.dominic.com"
echo 签发服务器证书 private/server.cer
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer
echo 服务器证书转换 private/server.p12
openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12

客户证书构建命令?
echo 构建客户私钥 private/client.key.pem
openssl genrsa -aes256 -out private/client.key.pem 2048
echo 生成服务器证书签发申请 private/client.csr
openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=BJ/L=BJ/O=dominic/OU=dominic/CN=www.dominic.com"
echo 签发客户证书 private/server.cer
openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem
echo 客户证书转换 certs/client.p12
openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP