2017-01-20 15:22:02 qq_30254057 阅读数 243
  • 《C语言/C++学习指南》加密解密篇(安全相关算法)

    本套视频教程介绍加密解密相关的常见算法,指出每种算法的应用场景,并给出使用示例。具体包含: (1) 数据转换(HEX和base64) (2) 对称加密 (DES, 3DES, AES) (3) 校验 CRC, MD5摘要, SHA1摘要 (4) 数字签名(HMAC-SHA1) , 并介绍了crypto++这个算法库的使用方法。

    25331 人正在学习 去看看 邵发

/*

 

 加密

 

 */

+ (NSString *)encrypt3DES:(NSString *)src key:(NSString *)key{

    const void *vplainText;

    size_t plainTextBufferSize;

    NSData* data = [src dataUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)];

    plainTextBufferSize = [data length];

    vplainText = (const void *)[data bytes];

    CCCryptorStatus ccStatus;

    uint8_t *bufferPtr = NULL;

    size_t bufferPtrSize = 0;

    size_t movedBytes = 0;

    

    bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);

    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));

    memset((void *)bufferPtr, 0x0, bufferPtrSize);

    const void *vkey = (const void *)[key UTF8String];

    

    ccStatus = CCCrypt(kCCEncrypt,

                       kCCAlgorithmDES,

                       kCCOptionPKCS7Padding | kCCOptionECBMode,

                       vkey,

                       kCCKeySizeDES,

                       nil,

                       vplainText,

                       plainTextBufferSize,

                       (void *)bufferPtr,

                       bufferPtrSize,

                       &movedBytes);

    

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

    return [self NSDataToHexString:myData];

}



/*

 

 解密

 

*/

+ (NSString *)decrypt3DES:(NSString *)src key:(NSString *)key{

    const void *vplainText;

    size_t plainTextBufferSize;

    NSData *EncryptData = [self hexStrToNSData:src];

    plainTextBufferSize = [EncryptData length];

    vplainText = [EncryptData bytes];

    CCCryptorStatus ccStatus;

    uint8_t *bufferPtr = NULL;

    size_t bufferPtrSize = 0;

    size_t movedBytes = 0;

    

    bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);

    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));

    memset((void *)bufferPtr, 0x0, bufferPtrSize);

    const void *vkey = (const void *)[key UTF8String];

    ccStatus = CCCrypt(kCCDecrypt,

                       kCCAlgorithmDES,

                       kCCOptionPKCS7Padding | kCCOptionECBMode,

                       vkey,

                       kCCKeySizeDES,

                       nil,

                       vplainText,

                       plainTextBufferSize,

                       (void *)bufferPtr,

                       bufferPtrSize,

                       &movedBytes);

    

    NSData *dataBuf = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];

    return [[NSString alloc] initWithData:dataBuf

                                 encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]

    ;

}



//十六进制字符串转化为二进制

- (NSData *)hexStrToNSData:(NSString *)hexStr{

    NSMutableData* data = [NSMutableData data];

    for (int i = 0; i+2 <= hexStr.length; i+=2) {

        NSRange range = NSMakeRange(i, 2);

        NSString* ch = [hexStr substringWithRange:range];

        NSScanner* scanner = [NSScanner scannerWithString:ch];

        unsigned int intValue;

        [scanner scanHexInt:&intValue];

        [data appendBytes:&intValue length:1];

    }

    

    return data;

}



//二进制转化为十六进制

- (NSString *)NSDataToHexString:(NSData *)data{

    if (data == nil) {

        return nil;

    }

    

    NSMutableString* hexString = [NSMutableString string];

    const unsigned char *p = [data bytes];

    for (int i=0; i < [data length]; i++) {

        [hexString appendFormat:@"%02x", *p++];

    }

    

    return [hexString uppercaseString];

}


2019-03-19 14:20:12 lpCrazyBoy 阅读数 435
  • 《C语言/C++学习指南》加密解密篇(安全相关算法)

    本套视频教程介绍加密解密相关的常见算法,指出每种算法的应用场景,并给出使用示例。具体包含: (1) 数据转换(HEX和base64) (2) 对称加密 (DES, 3DES, AES) (3) 校验 CRC, MD5摘要, SHA1摘要 (4) 数字签名(HMAC-SHA1) , 并介绍了crypto++这个算法库的使用方法。

    25331 人正在学习 去看看 邵发

IOS常用加密技术有三种:3DES、SHA1和MD5。其中,对称加密技术有:3DES和SHA1;非对称加密技术有:MD5;

对称加密:加密解密用的是同一个密钥。

非对称加密:生成公有密钥和私有密钥。一个加密,一个解密。

 

本篇介绍的是3DES加密解密技术:

1、创建HeaderFile文件My3DES.h。然后,添加以下代码,引用相关的头文件:

#import <CommonCrypto/CommonCrypto.h>

2、在BuildSetting面板中设置Objective-C Bridging Header的Value值为第1步创建的桥接文件所在的位置。比如:项目名/文件名.h。

3、配置好了之后,下面就开始使用了。

import UIKit

class ViewController: UIViewController {

    private let randomStringArray:[Character] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".map({$0});
    
    var key:String!;
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let data:Data = encrypt(encryptData: "http://www.baidu.com");
        decrypt(inputData: data);
    }

    func randomStringOfLength(_ length:Int) -> String {
        var string = "";
        for _ in(1...length) {
            string.append(randomStringArray[Int(arc4random_uniform(UInt32(randomStringArray.count) - 1))]);
        }
        return string;
    }
    
    //加密
    func encrypt(encryptData:String) -> Data {
        key = randomStringOfLength(kCCKeySize3DES);
        let inputData:Data = encryptData.data(using: String.Encoding.utf8)!;
        
        let keyData:Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!;
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes);
        let keyLength = size_t(kCCKeySize3DES);
        
        let dataLength = Int(inputData.count);
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes);
        let bufferData = NSMutableData(length: Int(dataLength) + kCCKeySize3DES)!;
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes);
        let bufferLength = size_t(bufferData.length);
        var bytesDecrypted = Int(0);
        
        let cryptStatus = CCCrypt(
            UInt32(kCCEncrypt),
            UInt32(kCCAlgorithm3DES),
            UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &bytesDecrypted
            );
        
        if Int32(cryptStatus) == Int32(kCCSuccess) {
            bufferData.length = bytesDecrypted;
            print("encrypt success");
            
        } else {
            print("加密过程出错\(cryptStatus)");
        }
        return bufferData as Data;
    }
    
    //解密
    func decrypt(inputData:Data) {
        let keyData:Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!;
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes);
        let keyLength = size_t(kCCKeySize3DES);
        
        let dataLength = Int(inputData.count);
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes);
        let bufferData = NSMutableData(length: Int(dataLength) + kCCKeySize3DES)!;
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes);
        let bufferLength = size_t(bufferData.length);
        var bytesDecrypted = Int(0);
        
        let cryptStatus = CCCrypt(
            UInt32(kCCDecrypt),
            UInt32(kCCAlgorithm3DES),
            UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
            keyBytes,
            keyLength,
            nil,
            dataBytes,
            dataLength,
            bufferPointer,
            bufferLength,
            &bytesDecrypted
        );
        
        if Int32(cryptStatus) == Int32(kCCSuccess) {
            bufferData.length = bytesDecrypted;
            let clearDataAsString = NSString(data: bufferData as Data, encoding: String.Encoding.utf8.rawValue);
            print("解密后的内容:\(clearDataAsString! as String)");
        } else {
            print("解密过程出错\(cryptStatus)");
        }
    }

}

输出结果为:

encrypt success
解密后的内容:http://www.baidu.com

2016-09-11 11:01:11 gwh111 阅读数 432
  • 《C语言/C++学习指南》加密解密篇(安全相关算法)

    本套视频教程介绍加密解密相关的常见算法,指出每种算法的应用场景,并给出使用示例。具体包含: (1) 数据转换(HEX和base64) (2) 对称加密 (DES, 3DES, AES) (3) 校验 CRC, MD5摘要, SHA1摘要 (4) 数字签名(HMAC-SHA1) , 并介绍了crypto++这个算法库的使用方法。

    25331 人正在学习 去看看 邵发

应用场景:

保存一些nsstring不希望别人看到,就简单加密,提取时解密

加密的原理看这里点击打开链接


新建一个DESTool的类,使用方便,不使用

开源库 GTMBase64 转码

ios7之后自己支持了base64的转码,所以不要再引入一个库了

将h和m文件贴到如下

h文件

//
//  DESTool.h
//  testDES
//
//  Created by apple on 16/9/11.
//  Copyright © 2016年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface DESTool : NSObject

+ (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key;

+ (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key;

@end

m文件

//
//  DESTool.m
//  testDES
//
//  Created by apple on 16/9/11.
//  Copyright © 2016年 apple. All rights reserved.
//

#import "DESTool.h"
#import <CommonCrypto/CommonCryptor.h>

@implementation DESTool

/*字符串加密
 *参数
 *plainText : 加密明文
 *key        : 密钥 64位
 */
+ (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key
{
    NSString *ciphertext = nil;
    const char *textBytes = [plainText UTF8String];
    NSUInteger dataLength = [plainText length];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    Byte iv[] = {1,2,3,4,5,6,7,8};
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding|kCCOptionECBMode,
                                          [key UTF8String], kCCKeySizeDES,
                                          iv,
                                          textBytes, dataLength,
                                          buffer, 1024,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
        
        ciphertext = [self encodeData:data];
    }
    return ciphertext;
}

//解密
+ (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key
{
    NSData* cipherData = [self decodeString:cipherText];
    unsigned char buffer[1024];
    memset(buffer, 0, sizeof(char));
    size_t numBytesDecrypted = 0;
    Byte iv[] = {1,2,3,4,5,6,7,8};
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding|kCCOptionECBMode,
                                          [key UTF8String],
                                          kCCKeySizeDES,
                                          iv,
                                          [cipherData bytes],
                                          [cipherData length],
                                          buffer,
                                          1024,
                                          &numBytesDecrypted);
    NSString* plainText = nil;
    if (cryptStatus == kCCSuccess) {
        NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
        plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    }
    return plainText;
}

+ (NSString *)encodeData:(NSData *)originData{
    
    NSString* encodeResult = [originData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    //    NSString* encodeResult = [originData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    return encodeResult;
}
+ (NSData *)decodeString:(NSString *)encodeResult{
    
    NSData* decodeData = [[NSData alloc] initWithBase64EncodedString:encodeResult options:0];
    //    NSString* decodeStr = [[NSString alloc] initWithData:decodeData encoding:NSASCIIStringEncoding];
    return decodeData;
}

@end


2016-05-04 15:42:32 CaryG 阅读数 2258
  • 《C语言/C++学习指南》加密解密篇(安全相关算法)

    本套视频教程介绍加密解密相关的常见算法,指出每种算法的应用场景,并给出使用示例。具体包含: (1) 数据转换(HEX和base64) (2) 对称加密 (DES, 3DES, AES) (3) 校验 CRC, MD5摘要, SHA1摘要 (4) 数字签名(HMAC-SHA1) , 并介绍了crypto++这个算法库的使用方法。

    25331 人正在学习 去看看 邵发


之前网络请求使用的加密方式一直都是md5加密。不过最近业务变了,后台要求使用新的加密方式,使用DES3方式进行加密。

下面简述一下在这里遇到的坑,主要讲的是ios端DES3加密。


想要使用DES3加密,必须了解它的算法或者有DES3加密算法的工具类。

下面是github上开源的DES3的工具类:

https://github.com/alanzhangg/DESThree


使用方法就很简单啦。

简单介绍一下:

在你的工程中导入这几个类,如果你使用的是ARC创建工程的话,需要给GTMBase64这个类,添加-fno-objc-arc的属性。

DES3Util这个类就是封装了DES3加密算法的类,参考一下工程中的实现就明白了。


然后,介绍一下Android端的DES3加密,这里是摘抄了别人的一部分代码。

首先是JAVA端的加密工具类,它同样适用于Android端,无需任何修改,即可保证Java与Android端的加解密一致,并且中文不会乱码。

package org.liuyq.des3;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

/**
 * 3DES加密工具类
 *
 * @author liufeng
 * @date 2012-10-11
 */
public class Des3 {
    // 密钥
    private final static String secretKey = "liuyunqiang@lx100$#365#$";
    // 向量
    private final static String iv = "01234567";
    // 加解密统一使用的编码方式
    private final static String encoding = "utf-8";
    
    /**
     * 3DES加密
     *
     * @param plainText 普通文本
     * @return
     * @throws Exception
     */
    public static String encode(String plainText) throws Exception {
        Key deskey = null;
        DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
        deskey = keyfactory.generateSecret(spec);
        
        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
        IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
        byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
        return Base64.encode(encryptData);
    }
    
    /**
     * 3DES解密
     *
     * @param encryptText 加密文本
     * @return
     * @throws Exception
     */
    public static String decode(String encryptText) throws Exception {
        Key deskey = null;
        DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
        deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
        IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
        
        byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));
        
        return new String(decryptData, encoding);
    }
}

上面的加密工具类会使用到Base64这个类,该类的源代码如下:

package org.liuyq.des3;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Base64编码工具类
 *
 * @author liufeng
 * @date 2012-10-11
 */
public class Base64 {
    private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
    
    public static String encode(byte[] data) {
        int start = 0;
        int len = data.length;
        StringBuffer buf = new StringBuffer(data.length * 3 / 2);
        
        int end = len - 3;
        int i = start;
        int n = 0;
        
        while (i <= end) {
            int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff);
            
            buf.append(legalChars[(d >> 18) & 63]);
            buf.append(legalChars[(d >> 12) & 63]);
            buf.append(legalChars[(d >> 6) & 63]);
            buf.append(legalChars[d & 63]);
            
            i += 3;
            
            if (n++ >= 14) {
                n = 0;
                buf.append(" ");
            }
        }
        
        if (i == start + len - 2) {
            int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8);
            
            buf.append(legalChars[(d >> 18) & 63]);
            buf.append(legalChars[(d >> 12) & 63]);
            buf.append(legalChars[(d >> 6) & 63]);
            buf.append("=");
        } else if (i == start + len - 1) {
            int d = (((int) data[i]) & 0x0ff) << 16;
            
            buf.append(legalChars[(d >> 18) & 63]);
            buf.append(legalChars[(d >> 12) & 63]);
            buf.append("==");
        }
        
        return buf.toString();
    }
    
    private static int decode(char c) {
        if (c >= 'A' && c <= 'Z')
            return ((int) c) - 65;
        else if (c >= 'a' && c <= 'z')
            return ((int) c) - 97 + 26;
        else if (c >= '0' && c <= '9')
            return ((int) c) - 48 + 26 + 26;
        else
            switch (c) {
                case '+':
                    return 62;
                case '/':
                    return 63;
                case '=':
                    return 0;
                default:
                    throw new RuntimeException("unexpected code: " + c);
            }
    }
    
    /**
     * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned.
     */
    
    public static byte[] decode(String s) {
        
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            decode(s, bos);
        } catch (IOException e) {
            throw new RuntimeException();
        }
        byte[] decodedBytes = bos.toByteArray();
        try {
            bos.close();
            bos = null;
        } catch (IOException ex) {
            System.err.println("Error while decoding BASE64: " + ex.toString());
        }
        return decodedBytes;
    }
    
    private static void decode(String s, OutputStream os) throws IOException {
        int i = 0;
        
        int len = s.length();
        
        while (true) {
            while (i < len && s.charAt(i) <= ' ')
                i++;
            
            if (i == len)
                break;
            
            int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3)));
            
            os.write((tri >> 16) & 255);
            if (s.charAt(i + 2) == '=')
                break;
            os.write((tri >> 8) & 255);
            if (s.charAt(i + 3) == '=')
                break;
            os.write(tri & 255);
            
            i += 4;
        }
    }
}

2018-02-28 14:35:48 kangpengpeng1 阅读数 66
  • 《C语言/C++学习指南》加密解密篇(安全相关算法)

    本套视频教程介绍加密解密相关的常见算法,指出每种算法的应用场景,并给出使用示例。具体包含: (1) 数据转换(HEX和base64) (2) 对称加密 (DES, 3DES, AES) (3) 校验 CRC, MD5摘要, SHA1摘要 (4) 数字签名(HMAC-SHA1) , 并介绍了crypto++这个算法库的使用方法。

    25331 人正在学习 去看看 邵发

本文全部转载自:http://www.cnblogs.com/hjtdlx/p/3926141.html


先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的最让人纠结的要属Java、Android和iPhone三个平台加解密不一致的问题。 因为手机端后台通常是用JAVA开发的Web Service,Android和iPhone客户端调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密。头疼的问题就来了,很难编写出一套加密程序,在3个平台间加解密的结果一致,总不能为 Android和iPhone两个客户端各写一套Web Service接口吧?我相信还会有很多朋友为此困惑,在此分享一套3DES加密程序,能够实现Java、Android和iPhone三个平台加解密一致

        首先是JAVA端的加密工具类,它同样适用于Android端,无需任何修改,即可保证Java与Android端的加解密一致,并且中文不会乱码。

  1. package org.liuyq.des3;  
  2.   
  3. import java.security.Key;  
  4.   
  5. import javax.crypto.Cipher;  
  6. import javax.crypto.SecretKeyFactory;  
  7. import javax.crypto.spec.DESedeKeySpec;  
  8. import javax.crypto.spec.IvParameterSpec;  
  9.   
  10. /** 
  11.  * 3DES加密工具类 
  12.  *  
  13.  * @author liufeng  
  14.  * @date 2012-10-11 
  15.  */  
  16. public class Des3 {  
  17.     // 密钥  
  18.     private final static String secretKey = "liuyunqiang@lx100$#365#$";  
  19.     // 向量  
  20.     private final static String iv = "01234567";  
  21.     // 加解密统一使用的编码方式  
  22.     private final static String encoding = "utf-8";  
  23.   
  24.     /** 
  25.      * 3DES加密 
  26.      *  
  27.      * @param plainText 普通文本 
  28.      * @return 
  29.      * @throws Exception  
  30.      */  
  31.     public static String encode(String plainText) throws Exception {  
  32.         Key deskey = null;  
  33.         DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());  
  34.         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");  
  35.         deskey = keyfactory.generateSecret(spec);  
  36.   
  37.         Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");  
  38.         IvParameterSpec ips = new IvParameterSpec(iv.getBytes());  
  39.         cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);  
  40.         byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));  
  41.         return Base64.encode(encryptData);  
  42.     }  
  43.   
  44.     /** 
  45.      * 3DES解密 
  46.      *  
  47.      * @param encryptText 加密文本 
  48.      * @return 
  49.      * @throws Exception 
  50.      */  
  51.     public static String decode(String encryptText) throws Exception {  
  52.         Key deskey = null;  
  53.         DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());  
  54.         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");  
  55.         deskey = keyfactory.generateSecret(spec);  
  56.         Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");  
  57.         IvParameterSpec ips = new IvParameterSpec(iv.getBytes());  
  58.         cipher.init(Cipher.DECRYPT_MODE, deskey, ips);  
  59.   
  60.         byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));  
  61.   
  62.         return new String(decryptData, encoding);  
  63.     }  
  64. }  

        上面的加密工具类会使用到Base64这个类,该类的源代码如下:

  1. package org.liuyq.des3;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.OutputStream;  
  5.   
  6. /** 
  7.  * Base64编码工具类 
  8.  *  
  9.  * @author liufeng  
  10.  * @date 2012-10-11 
  11.  */  
  12. public class Base64 {  
  13.     private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();  
  14.   
  15.     public static String encode(byte[] data) {  
  16.         int start = 0;  
  17.         int len = data.length;  
  18.         StringBuffer buf = new StringBuffer(data.length * 3 / 2);  
  19.   
  20.         int end = len - 3;  
  21.         int i = start;  
  22.         int n = 0;  
  23.   
  24.         while (i <= end) {  
  25.             int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff);  
  26.   
  27.             buf.append(legalChars[(d >> 18) & 63]);  
  28.             buf.append(legalChars[(d >> 12) & 63]);  
  29.             buf.append(legalChars[(d >> 6) & 63]);  
  30.             buf.append(legalChars[d & 63]);  
  31.   
  32.             i += 3;  
  33.   
  34.             if (n++ >= 14) {  
  35.                 n = 0;  
  36.                 buf.append(" ");  
  37.             }  
  38.         }  
  39.   
  40.         if (i == start + len - 2) {  
  41.             int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8);  
  42.   
  43.             buf.append(legalChars[(d >> 18) & 63]);  
  44.             buf.append(legalChars[(d >> 12) & 63]);  
  45.             buf.append(legalChars[(d >> 6) & 63]);  
  46.             buf.append("=");  
  47.         } else if (i == start + len - 1) {  
  48.             int d = (((int) data[i]) & 0x0ff) << 16;  
  49.   
  50.             buf.append(legalChars[(d >> 18) & 63]);  
  51.             buf.append(legalChars[(d >> 12) & 63]);  
  52.             buf.append("==");  
  53.         }  
  54.   
  55.         return buf.toString();  
  56.     }  
  57.   
  58.     private static int decode(char c) {  
  59.         if (c >= 'A' && c <= 'Z')  
  60.             return ((int) c) - 65;  
  61.         else if (c >= 'a' && c <= 'z')  
  62.             return ((int) c) - 97 + 26;  
  63.         else if (c >= '0' && c <= '9')  
  64.             return ((int) c) - 48 + 26 + 26;  
  65.         else  
  66.             switch (c) {  
  67.             case '+':  
  68.                 return 62;  
  69.             case '/':  
  70.                 return 63;  
  71.             case '=':  
  72.                 return 0;  
  73.             default:  
  74.                 throw new RuntimeException("unexpected code: " + c);  
  75.             }  
  76.     }  
  77.   
  78.     /** 
  79.      * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned. 
  80.      */  
  81.   
  82.     public static byte[] decode(String s) {  
  83.   
  84.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  85.         try {  
  86.             decode(s, bos);  
  87.         } catch (IOException e) {  
  88.             throw new RuntimeException();  
  89.         }  
  90.         byte[] decodedBytes = bos.toByteArray();  
  91.         try {  
  92.             bos.close();  
  93.             bos = null;  
  94.         } catch (IOException ex) {  
  95.             System.err.println("Error while decoding BASE64: " + ex.toString());  
  96.         }  
  97.         return decodedBytes;  
  98.     }  
  99.   
  100.     private static void decode(String s, OutputStream os) throws IOException {  
  101.         int i = 0;  
  102.   
  103.         int len = s.length();  
  104.   
  105.         while (true) {  
  106.             while (i < len && s.charAt(i) <= ' ')  
  107.                 i++;  
  108.   
  109.             if (i == len)  
  110.                 break;  
  111.   
  112.             int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3)));  
  113.   
  114.             os.write((tri >> 16) & 255);  
  115.             if (s.charAt(i + 2) == '=')  
  116.                 break;  
  117.             os.write((tri >> 8) & 255);  
  118.             if (s.charAt(i + 3) == '=')  
  119.                 break;  
  120.             os.write(tri & 255);  
  121.   
  122.             i += 4;  
  123.         }  
  124.     }  
  125. }  

        接下来是iPhone端的加密程序,当然是用Ojbective-C写的3DES加密程序,源代码如下:

  1. //  
  2. //  DES3Util.h  
  3. //  lx100-gz  
  4. //  
  5. //  Created by  柳峰 on 12-10-10.  
  6. //  Copyright 2012 http://blog.csdn.net/lyq8479. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11.   
  12. @interface DES3Util : NSObject {  
  13.   
  14. }  
  15.   
  16. // 加密方法  
  17. + (NSString*)encrypt:(NSString*)plainText;  
  18.   
  19. // 解密方法  
  20. + (NSString*)decrypt:(NSString*)encryptText;  
  21.   
  22. @end  
  1. //  
  2. //  DES3Util.m  
  3. //  lx100-gz  
  4. //  
  5. //  Created by  柳峰 on 12-9-17.  
  6. //  Copyright 2012 http://blog.csdn.net/lyq8479. All rights reserved.  
  7. //  
  8.   
  9. #import "DES3Util.h"  
  10. #import <CommonCrypto/CommonCryptor.h>  
  11. #import "GTMBase64.h"  
  12.   
  13. #define gkey            @"liuyunqiang@lx100$#365#$"  
  14. #define gIv             @"01234567"  
  15.   
  16. @implementation DES3Util  
  17.   
  18. // 加密方法  
  19. + (NSString*)encrypt:(NSString*)plainText {  
  20.     NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];  
  21.     size_t plainTextBufferSize = [data length];  
  22.     const void *vplainText = (const void *)[data bytes];  
  23.       
  24.     CCCryptorStatus ccStatus;  
  25.     uint8_t *bufferPtr = NULL;  
  26.     size_t bufferPtrSize = 0;  
  27.     size_t movedBytes = 0;  
  28.       
  29.     bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);  
  30.     bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));  
  31.     memset((void *)bufferPtr, 0x0, bufferPtrSize);  
  32.       
  33.     const void *vkey = (const void *) [gkey UTF8String];  
  34.     const void *vinitVec = (const void *) [gIv UTF8String];  
  35.       
  36.     ccStatus = CCCrypt(kCCEncrypt,  
  37.                        kCCAlgorithm3DES,  
  38.                        kCCOptionPKCS7Padding,  
  39.                        vkey,  
  40.                        kCCKeySize3DES,  
  41.                        vinitVec,  
  42.                        vplainText,  
  43.                        plainTextBufferSize,  
  44.                        (void *)bufferPtr,  
  45.                        bufferPtrSize,  
  46.                        &movedBytes);  
  47.       
  48.     NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];  
  49.     NSString *result = [GTMBase64 stringByEncodingData:myData];  
  50.     return result;  
  51. }  
  52.   
  53. // 解密方法  
  54. + (NSString*)decrypt:(NSString*)encryptText {  
  55.     NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];  
  56.     size_t plainTextBufferSize = [encryptData length];  
  57.     const void *vplainText = [encryptData bytes];  
  58.       
  59.     CCCryptorStatus ccStatus;  
  60.     uint8_t *bufferPtr = NULL;  
  61.     size_t bufferPtrSize = 0;  
  62.     size_t movedBytes = 0;  
  63.       
  64.     bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);  
  65.     bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));  
  66.     memset((void *)bufferPtr, 0x0, bufferPtrSize);  
  67.       
  68.     const void *vkey = (const void *) [gkey UTF8String];  
  69.     const void *vinitVec = (const void *) [gIv UTF8String];  
  70.       
  71.     ccStatus = CCCrypt(kCCDecrypt,  
  72.                        kCCAlgorithm3DES,  
  73.                        kCCOptionPKCS7Padding,  
  74.                        vkey,  
  75.                        kCCKeySize3DES,  
  76.                        vinitVec,  
  77.                        vplainText,  
  78.                        plainTextBufferSize,  
  79.                        (void *)bufferPtr,  
  80.                        bufferPtrSize,  
  81.                        &movedBytes);  
  82.       
  83.     NSString *result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr   
  84.                                 length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding] autorelease];  
  85.     return result;  
  86. }  
  87.   
  88. @end  

        iPhone端的加密工具类中引入了“GTMBase64.h”,这是iOS平台的Base64编码工具类,就不在这里贴出相关代码了,需要的百度一下就能找到,实在找不到就回复留言给我。

        好了,赶紧试一下吧,JAVA,Android和iPhone三个平台的加密不一致问题是不是解决了呢?其实,对此问题,还有一种更好的实现方式,那就是用C语言写一套加密程序,这样在iOS平台是可以直接使用C程序的,而在Java和Android端通过JNI去调用C语言编写的加密方法,这是不是就实现了3个平台调用同一套加密程序呢?

iOS POS之3DES加密

阅读数 1210

没有更多推荐了,返回首页