`
sgm881218
  • 浏览: 56781 次
社区版块
存档分类
最新评论

java实用工具(用3des进行ios加密后台解密)

    博客分类:
  • java
阅读更多
IOS 学习通信加密
通信加解密基本算是每个涉及到用户信息的客户端都会用到的一个技术。
一般我们可能就做简单的防篡改和密文加密。
很多时候做一个加密只不过是一个小小的心理安慰吧了??因为纯粹的从安全角度来说??安全
性真的不高。
对于一些手机支付以及银联的客户端??我看到有用的证书什么来实现。
因为没做过??所以也不是太了解。
这边就说下最简单的加密方案。
一??MD5 数字摘要。
准确来说??MD5 不能叫做加解密??因为它不可逆性。
一般我们理解的加解密是能加密??然后解密的。
MD5 只是根据数据生个一个校验码??然后对于数据接受者接受到内容后同样的在通过md5
来生成校验码于之前的校验码对比是否一致??
从而来判断数据在传送过程中是否被截取篡改过。
说白了??其实在传输过程中??仅仅md5 技术??数据任然是明文的。
下面我来来看下IOS 中对md5 加密的支持。
[cpp] view plaincopy
1. const char *original_str = [string UTF8String];//string 为摘要内容??转成char
2.
3. /****系统api~~~~*****/
4. unsigned char result[CC_MD5_DIGEST_LENGTH];
5. CC_MD5(original_str, strlen(original_str), result);//调通系统md5 加密
6. NSMutableString *hash = [[NSMutableString string]autorelease];
7. for (int i = 0; i < 16; i++)
8. [hash appendFormat:@"%02X", result[i]];
9. return hash ;//校验码
代码很简单??因为内部算法都是系统已经完成的。
对于以上来看??仍然没有很好的处理密文传输只是在数据传输过程成做了一个简单的防篡改。
因此需要使用一种能生成密文的安全机制类支持。
二??ios 中3DES 加密
3DES 是一种对称的加密方式??因为用的同一个密钥。
对于加解密的安全性什么大家可以google??baidu 自己找资料参考。
我也不过是简单的说一下通信加密中的一种可实现方案而已。
同样的3DES 加密基本也都是统一的??系统也直接提供了API??基本代码如下
[cpp] view plaincopy
1. //3des 加解密
2. + (NSString*)TripleDES:(NSString*)plainText encryptOrDecrypt:(CCOperation)en
cryptOrDecrypt
3. {
4.
5. const void *vplainText;
6. size_t plainTextBufferSize;
7.
8. if (encryptOrDecrypt == kCCDecrypt)//解密
9. {
10. NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEnco
ding:NSUTF8StringEncoding]];
11. plainTextBufferSize = [EncryptData length];
12. vplainText = [EncryptData bytes];
13. }
14. else //加密
15. {
16. NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
17. plainTextBufferSize = [data length];
18. vplainText = (const void *)[data bytes];
19. }
20.
21. CCCryptorStatus ccStatus;
22. uint8_t *bufferPtr = NULL;
23. size_t bufferPtrSize = 0;
24. size_t movedBytes = 0;
25.
26. bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSiz
e3DES - 1);
27. bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
28. memset((void *)bufferPtr, 0x0, bufferPtrSize);
29. // memset((void *) iv, 0x0, (size_t) sizeof(iv));
30.
31. const void *vkey = (const void *) [DESKEY UTF8String];
32. // NSString *initVec = @"init Vec";
33. //const void *vinitVec = (const void *) [initVec UTF8String];
34. // Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
35. ccStatus = CCCrypt(encryptOrDecrypt,
36. kCCAlgorithm3DES,
37. kCCOptionPKCS7Padding | kCCOptionECBMode,
38. vkey,
39. kCCKeySize3DES,
40. nil,
41. vplainText,
42. plainTextBufferSize,
43. (void *)bufferPtr,
44. bufferPtrSize,
45. &movedBytes);
46. //if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
47. /*else if (ccStatus == kCC ParamError) return @"PARAM ERROR";
48. else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
49. else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
50. else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
51. else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
52. else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; */
53.
54. NSString *result;
55.
56. if (encryptOrDecrypt == kCCDecrypt)
57. {
58. result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(cons
t void *)bufferPtr
59. length:(NSUI
nteger)movedBytes]
60. encoding:NSUTF8StringEncoding]
61. autorelease];
62. }
63. else
64. {
65. NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr lengt
h:(NSUInteger)movedBytes];
66. result = [GTMBase64 stringByEncodingData:myData];
67. }
68.
69. return result;
这个在网上也能搜索到详细代码。
但是要注意到一点??
[cpp] view plaincopy
1. CCCrypt(encryptOrDecrypt,
2. kCCAlgorithm3DES,
3. kCCOptionPKCS7Padding | kCCOptionECBMode,
4. vkey,
5. kCCKeySize3DES,
6. nil,
7. vplainText,
8. plainTextBufferSize,
9. (void *)bufferPtr,
10. bufferPtrSize,
11. &movedBytes);
这个里面的参数可能会根据你服务端使用的对应的3des 算法构造时参数的不同而需要自己
调整。
比如我在网上看到的这个第三个参数只是用了kCCOptionPKCS7Padding??第六个可选参
数用了上面一个自定义的iv。
但是这边根据服务器??这个参数是nil 才对应。
这边也附上java 端的加解密代码
[java] view plaincopy
1. public String encryptThreeDESECB(String src,String key) throws Exception
2. {
3. DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
4. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
5. SecretKey securekey = keyFactory.generateSecret(dks);
6.
7. Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
8. cipher.init(Cipher.ENCRYPT_MODE, securekey);
9. byte[] b=cipher.doFinal(src.getBytes());
10.
11. BASE64Encoder encoder = new BASE64Encoder();
12. return encoder.encode(b).replaceAll("\r", "").replaceAll("\n", "");
13.
14. }
15.
16. //3DESECB 解密,key 必须是长度大于等于 3*8 = 24 位
17. public String decryptThreeDESECB(String src,String key) throws Exception
18. {
19. //--通过base64,将字符串转成byte 数组
20. BASE64Decoder decoder = new BASE64Decoder();
21. byte[] bytesrc = decoder.decodeBuffer(src);
22. //--解密的key
23. DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
24. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
25. SecretKey securekey = keyFactory.generateSecret(dks);
26.
27. //--Chipher 对象解密
28. Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
29. cipher.init(Cipher.DECRYPT_MODE, securekey);
30. byte[] retByte = cipher.doFinal(bytesrc);
31.
32. return new String(retByte);
33. }
内容也很少??这这么点。
然后是key??也就是共用密钥的客户端和服务端都保存一个。
简单从数据传输来说??密文传输了??安全性相对来说提高了不少。
但是如果破解了客户端代码??那么其实密钥也就暴露了。
这对于android 上面来说??因为反编译额纯在??安全性不敢恭维??
ios 的貌似好一点??因为暂未听说反编译ios 的app 的。
以上就是一种简单的通信加密方案。
当然??其实这些其实算是通用技术~


以下是DESUtil备份:
package com.omg.web.util;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
 
public class DESUtil { 
     
    //KeyGenerator 提供对称密钥生成器的功能,支持各种算法 
    private  KeyGenerator keygen; 
    //SecretKey 负责保存对称密钥 
    private  SecretKey deskey; 
    //Cipher负责完成加密或解密工作 
    private  Cipher c; 
    //该字节数组负责保存加密的结果 
    private  byte[] cipherByte; 
     
    public  DESUtil() throws NoSuchAlgorithmException, NoSuchPaddingException{ 
        Security.addProvider(new com.sun.crypto.provider.SunJCE()); 
        //实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常) 
        keygen = KeyGenerator.getInstance("DES"); 
        //生成密钥 
        deskey = keygen.generateKey(); 
        //生成Cipher对象,指定其支持的DES算法 
        c = Cipher.getInstance("DES"); 
    } 
     
    /**
     * 对字符串加密
     * 
     * @param str
     * @return
     * @throws InvalidKeyException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */ 
    public  byte[] Encrytor(String str) throws InvalidKeyException, 
            IllegalBlockSizeException, BadPaddingException { 
        // 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式 
        c.init(Cipher.ENCRYPT_MODE, deskey); 
        byte[] src = str.getBytes(); 
        // 加密,结果保存进cipherByte 
        cipherByte = c.doFinal(src); 
        return cipherByte; 
    } 
 
    /**
     * 对字符串解密
     * 
     * @param buff
     * @return
     * @throws InvalidKeyException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */ 
    public  byte[] Decryptor(byte[] str) throws InvalidKeyException, 
            IllegalBlockSizeException, BadPaddingException { 
        // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式 
        c.init(Cipher.DECRYPT_MODE, deskey); 
        cipherByte = c.doFinal(str); 
        return cipherByte; 
    } 
   
    public static String parseByte2HexStr(byte buf[]) { 
        StringBuffer sb = new StringBuffer(); 
        for (int i = 0; i < buf.length; i++) { 
                String hex = Integer.toHexString(buf[i] & 0xFF); 
                if (hex.length() == 1) { 
                        hex = '0' + hex; 
                } 
                sb.append(hex.toUpperCase()); 
        } 
        return sb.toString(); 

    /**将16进制转换为二进制
     * @param hexStr
     * @return
     */ 
    public static byte[] parseHexStr2Byte(String hexStr) { 
            if (hexStr.length() < 1) 
                    return null; 
            byte[] result = new byte[hexStr.length()/2]; 
            for (int i = 0;i< hexStr.length()/2; i++) { 
                    int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); 
                    int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); 
                    result[i] = (byte) (high * 16 + low); 
            } 
            return result; 
    } 
   public String encode(String src,String key) throws Exception
    {
    DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
    SecretKey securekey = keyFactory.generateSecret(dks);
  
    Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, securekey);
    byte[] b=cipher.doFinal(src.getBytes());
  
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(b).replaceAll("\r", "").replaceAll("\n", "");
  
    }
  
    //3DESECB 解密,key 必须是长度大于等于 3*8 = 24 位
    public String decode(String src,String key) throws Exception
    {
    //--通过base64,将字符串转成byte 数组
    BASE64Decoder decoder = new BASE64Decoder();
    byte[] bytesrc = decoder.decodeBuffer(src);
    //--解密的key
    DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
    SecretKey securekey = keyFactory.generateSecret(dks);
  
    //--Chipher 对象解密
    Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, securekey);
    byte[] retByte = cipher.doFinal(bytesrc);
  
    return new String(retByte);
    }
  
  



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics