1.DES算法的
DES算法的介绍和相关说明我就不讲了,大家可以自己google,要了解的就是DES算法属于块加密算法,通常是64位为一块来进行加密,因此就这会涉及到块填充的问题。所以如果是异构系统间的通讯,一定要问清楚大家的块填充方式,当然最好就是要加密的明文刚好是64位的倍数,这样双方都不用填充。另外DES算法加密后不会改变长度
我自己下的DESUtil如下
1 private static final String TDESAlgorithm = "TripleDES";
2 private static final String DESAlgorithm = "DES/ECB/NoPadding";
3 /** *//**
4 * ECB模式和NoPadding填充的DES加密函数。
5 * @param src - 明文
6 * @param sKeyByte - 密钥
7 * @return encryptByte - 密文
8 */
9 public static byte[] encryptWithDES(byte[] src,byte[] sKeyByte){
10 try {
11 Cipher myCipher = Cipher.getInstance(DESAlgorithm);
12 SecretKey sKey = new SecretKeySpec(sKeyByte,"DES");
13 myCipher.init(Cipher.ENCRYPT_MODE, sKey);
14 byte[] encryptByte = myCipher.doFinal(src);
15 return encryptByte;
16 } catch (NoSuchAlgorithmException e) {
17 e.printStackTrace();
18 } catch (NoSuchPaddingException e) {
19 e.printStackTrace();
20 } catch (InvalidKeyException e) {
21 e.printStackTrace();
22 } catch (IllegalBlockSizeException e) {
23 e.printStackTrace();
24 } catch (BadPaddingException e) {
25 e.printStackTrace();
26 }
27 return null;
28 }
29
30 /** *//**
31 * ECB模式和NoPadding填充的DES解密函数。
32 * @param src - 密文
33 * @param sKeyByte - 密钥
34 * @return decryptByte - 明文
35 */
36 public static byte[] decryptWithDES(byte[] src,byte[] sKeyByte){
37 try {
38 Cipher myCipher = Cipher.getInstance(DESAlgorithm);
39 SecretKey sKey = new SecretKeySpec(sKeyByte,"DES");
40 myCipher.init(Cipher.DECRYPT_MODE, sKey);
41 byte[] decryptByte = myCipher.doFinal(src);
42 return decryptByte;
43 } catch (NoSuchAlgorithmException e) {
44 e.printStackTrace();
45 } catch (NoSuchPaddingException e) {
46 e.printStackTrace();
47 } catch (InvalidKeyException e) {
48 e.printStackTrace();
49 } catch (IllegalBlockSizeException e) {
50 e.printStackTrace();
51 } catch (BadPaddingException e) {
52 e.printStackTrace();
53 }
54 return null;
55 }
2.RSA算法
相对DES算法,RSA算法是比较复杂的了,说复杂是因为在异构系统之间的兼容性差一点。具体介绍也不说了,RSA算法需要注意的是
The RSA algorithm can only encrypt data that has a maximum byte length of the RSA key length in bits divided with eight minus eleven padding bytes, i.e. number of maximum bytes = key length in bits / 8 - 11. In your case it means 2048 / 8 - 11 = 245. If you want to encrypt larger data, then use a larger key, for example, a key with 4096 bits will allow you to encrypt 501 bytes of data. 也就是密文长度和密钥长度之间的一个关系,否则也会导致加密失败。RSA算法加密后会改变长度
RSA中另外一个关键的概念是 模,公用指数和私钥的关系
模和公用指数生成公钥,Java中的公用指数有自定义的两个RSAKeyGenParameterSpec.F1和RSAKeyGenParameterSpec.F4
生成公钥key的方式为
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(modulus, RSAKeyGenParameterSpec.F4);
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec);
模和私钥指数生成私钥,方式为
RSAPrivateKeySpec privKeySpec = new RSAPrivateKeySpec(modulus,prikeyInteger);
RSAPrivateKey privKey = (RSAPrivateKey)keyFactory.generatePrivate(privKeySpec);
这些参数都是以BigInteger的方式传入的,具体可以参看BigInteger的构造函数,其中有一个常用的是
BigInteger bint = new BigInteger(String str,int radix)
用途是把str按照radix进制来解析,非常方便。Integer也有这种类似的方法,所以十六进制和十进制的转换也可以用这个方式变相实现。
Java里边有两本书对加密解密说的比较详细,个人认为还不错。
Java的RSA中需要特别注意的是,java没有无符号数这个概念,所以有的时候要特别注意密钥,模的正负关系
《Beginning Cryptography with Java》
《Core Security Patterns: Best Practices and Strategies for J2EE(TM), Web Services, and Identity Management (Core Series)》(中文名:《安全模式--J2EE、WEB服务和身份管理最佳实践与策略》)
posted on 2007-07-20 14:47
Caixiaopig 阅读(1182)
评论(0) 编辑 收藏 所属分类:
Java高级