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

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);
    }
  
  



分享到:
评论

相关推荐

    DES加密解密一套JAVA&IOS

    本资源"DES加密解密一套JAVA&IOS"提供了一套跨平台的解决方案,允许JAVA和iOS应用之间进行互操作性的加密和解密操作。 在JAVA平台上,DES加密和解密通常通过Java的`javax.crypto`包来实现。这个包提供了`Cipher`类...

    php,java,ios 统一的des 加密

    文件`des.php`可能包含了PHP的实现代码,`des-ios.zip`可能包含了一个iOS项目,其中包含了Objective-C或Swift的加密解密逻辑,而`des-java.zip`则可能包含了一个Java项目的源码。 总的来说,这个解决方案旨在提供一...

    android ios java后台通用DES base64加密

    "android ios java后台通用DES base64加密"这个主题涉及到两种常见的加密技术:DES(Data Encryption Standard)和Base64,它们在保护敏感信息方面发挥着重要作用。 DES是一种对称加密算法,由美国国家标准局在1970...

    android iOS php des 互通加密解密算法

    `DES`(Data Encryption Standard)是一种广泛使用的对称加密算法,它允许这三种平台之间进行加密解密操作,确保数据的机密性。本篇将详细讲解如何在`Android`、`iOS`和`PHP`中实现`DES`加密解密,并探讨其在中文和...

    iOS使用DES、3DES、AES加密

    iOS 使用DES、3DES、AES加密和解密

    iOS DES加解密

    以下是一个简单的Objective-C示例,演示如何使用CommonCrypto进行DES加密和解密: ```objc #import // 加密 + (NSData *)encryptWithDES:(NSData *)data key:(NSString *)key { const void *cKey = [key UTF8...

    IOS des加密 demo

    本DEMO是针对iOS平台实现DES加密的一个实例,它可以帮助开发者理解如何在iOS应用中集成并使用DES加密技术。 DES算法起源于1970年代,由IBM开发,后来被美国国家标准局采纳为标准。它基于64位的数据块和56位的密钥...

    ios_des加密.zip_iOS的des加密_ios_ios_des_安卓加密

    虽然它本身并不直接支持DES加密,但可能包含了一些辅助功能,如日志记录、线程管理等,可以用于构建加密解密的框架。 总的来说,这个压缩包提供了一种在iOS应用中实现DES加密和解密的方法,同时也可能涉及到在...

    ios常见加密解密方法(RSA、DES 、AES、MD5)

    本文将详细介绍几种常见的加密解密方法,包括RSA、DES、AES以及MD5,并针对iOS环境中的具体使用情况进行分析。 首先,RSA是一种非对称加密算法,其特点是拥有两个密钥——公钥和私钥。公钥用于加密,私钥用于解密。...

    flutter_des:Java,Android,iOS通过DES加密和解密获得相同的结果

    Java,android,ios通过DES加密和解密获得相同的结果。 DES算法:CBC操作:(android)PKCS5Padding(ios)kCCOptionPKCS7Padding 入门 添加依赖 dependencies : flutter_des : ^2.0.0 # latest version 例子 ...

    3Des加密,在ios,android ,java服务端都实现了

    在提供的文件名"DES3Demo"和"DES3DemoJavaAndroid"中,我们可以推测这些可能是示例代码或项目的源码,包含iOS、Android和Java的3Des加密实现。通过查看这些代码,开发者可以深入理解每种平台的具体实现细节,并根据...

    ios des 加密demo

    调用ios底层框架,导入c语言包用des进行加密解密,我测试过了,很好用。

    3DES+Base64加密解密算法

    在iOS中实现3DES+Base64加密解密,可以使用CommonCrypto库,该库提供了低级别的加密操作接口。开发者需要自己编写代码来实现密钥的生成、数据的分组以及3DES的加密解密过程,并结合Base64编码解码函数。 需要注意的...

    Base64转码,AES加密解密,IOS,Android,Java

    Base64转码,AES加密解密,IOS,Android,Java 后台。 本工程可以直接使用,而且与IOS,Android,JAVA 已调通。 主要用于客户端进行通信,数据之间地安全性。对数据进行加密和解密。 适用于银行等较为保密的项目中。 ...

    iOS一行代码进行RSA、DES 、AES、MD5加密、解密Demo

    在iOS中,我们可以通过CryptoSwift库实现DES加密解密: ```swift import CryptoSwift func desEncrypt(data: Data, key: Data) -&gt; Data? { // DES加密逻辑 } func desDecrypt(data: Data, key: Data) -&gt; Data? {...

    iOS des加密

    总的来说,iOS中的DES加密解密涉及到CommonCrypto库的使用,理解加密算法的基本原理,以及如何在代码中正确地实施这些操作。尽管DES在现代安全标准中已经显得较为薄弱,但理解其工作方式有助于开发者更好地掌握加密...

    DES加解密_iOS_Java.zip

    总的来说,这个“DES加解密_iOS_Java.zip”工具包是跨平台数据安全的实用工具,简化了iOS和Java开发者的加密工作,使得在两个平台上实现数据一致性加密成为可能。在实际应用中,除了基本的加密解密,还需要考虑更...

    iOS加解密源码(3DES)

    3DES的基本流程是:数据先用一个密钥进行DES加密,然后解密,再用另一个密钥重新加密,最后再解密一次。这样做的目的是增加破解的难度,使攻击者需要三次破解密钥,极大地增强了数据的安全性。3DES在iOS中常用于保护...

Global site tag (gtag.js) - Google Analytics