3DES+Base64 加密解密的方法

转:http://www.wybsw.com/bbs/ShowPost.asp?PostID=2212

3DES+Base64 加密解密的方法


#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h"      // Open source,base64处理,就两个文件,自己从网上下载下吧

+ (NSString*)TripleDES:(NSString*)plainText encryptOrDecrypt:(CCOperation)encryptOrDecrypt key:(NSString*)key {
   
   
    const void *vplainText;
    size_t plainTextBufferSize;
   
    if (encryptOrDecrypt == kCCDecrypt)
    {
        NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEncoding:NSUTF8StringEncoding]];
        plainTextBufferSize = [EncryptData length];
        vplainText = [EncryptData bytes];
    }
    else
    {
        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
        plainTextBufferSize = [data length];
        vplainText = (const void *)[data bytes];
    }
   
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    // uint8_t ivkCCBlockSize3DES;
   
    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    // memset((void *) iv, 0x0, (size_t) sizeof(iv));
   
    //    NSString *key = @"123456789012345678901234";
    NSString *initVec = @"init Vec";
    const void *vkey = (const void *) [key UTF8String];
    const void *vinitVec = (const void *) [initVec UTF8String];
   
    ccStatus = CCCrypt(encryptOrDecrypt,
                      kCCAlgorithm3DES,
                      kCCOptionPKCS7Padding,
                      vkey, //"123456789012345678901234", //key
                      kCCKeySize3DES,
                      vinitVec, //"init Vec", //iv,
                      vplainText, //"Your Name", //plainText,
                      plainTextBufferSize,
                      (void *)bufferPtr,
                      bufferPtrSize,
                      &movedBytes);
    //if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
    /*else if (ccStatus == kCC ParamError) return @"PARAM ERROR";
    else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
    else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
    else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
    else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
    else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED"; */
   
    NSString *result;
   
    if (encryptOrDecrypt == kCCDecrypt)
    {
        result = [[[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                length:(NSUInteger)movedBytes]
                                        encoding:NSUTF8StringEncoding]
                  autorelease];
    }
    else
    {
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        result = [GTMBase64 stringByEncodingData:myData];
    }
   
    return result;
   
}


调用示例代码

 

  NSString* req = @"234234234234234中国";
    NSString* key = @"888fdafdakfjak;";
   
    NSString* ret1 = [NSString TripleDES:req encryptOrDecrypt:kCCEncrypt key:key];       
    NSLog(@"3DES/Base64 Encode Result=%@", ret1);
   
    NSString* ret2 = [NSString TripleDES:ret1 encryptOrDecrypt:kCCDecrypt key:key];
    NSLog(@"3DES/Base64 Decode Result=%@", ret2);




Consider using NSData to get the string value, and perhaps use Base64 or some other form of encoding when passing over the network (and then decoding from Base64 to whatever in Java).

Here's an example of some code that might help you get started. I'm doing a HMAC-SHA1 signature ('digest') here, but the general idea is the same for your RSA case:
#import <Foundation/NSString.h>
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonDigest.h>

@interface NSString (NSStringAdditions)

+ (NSString *) base64StringFromData:(NSData *)data length:(int)length;
- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey;

@end

-------------------------------------------

#import "NSStringAdditions.h"

static char base64EncodingTable[64] = {
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};

@implementation NSString (NSStringAdditions)

- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey {
  unsigned char digest[CC_SHA1_DIGEST_LENGTH];
  char *keyCharPtr = strdup([secretKey UTF8String]);
  char *dataCharPtr = strdup([self UTF8String]);

  CCHmacContext hctx;
  CCHmacInit(&hctx, kCCHmacAlgSHA1, keyCharPtr, strlen(keyCharPtr));
  CCHmacUpdate(&hctx, dataCharPtr, strlen(dataCharPtr));
  CCHmacFinal(&hctx, digest);
  NSData *encryptedStringData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];

  free(keyCharPtr);
  free(dataCharPtr);

  return [NSString base64StringFromData:encryptedStringData length:[encryptedStringData length]];
}

+ (NSString *) base64StringFromData: (NSData *)data length: (int)length {
  unsigned long ixtext, lentext;
  long ctremaining;
  unsigned char input[3], output[4];
  short i, charsonline = 0, ctcopy;
  const unsigned char *raw;
  NSMutableString *result;

  lentext = [data length];
  if (lentext < 1)
    return @"";
  result = [NSMutableString stringWithCapacity: lentext];
  raw = [data bytes];
  ixtext = 0;

  while (true) {
    ctremaining = lentext - ixtext;
    if (ctremaining <= 0)
      break;       
    for (i = 0; i < 3; i++) {
      unsigned long ix = ixtext + i;
      if (ix < lentext)
          input = raw[ix];
      else
          input = 0;
    }
    output[0] = (input[0] & 0xFC) >> 2;
    output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
    output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
    output[3] = input[2] & 0x3F;
    ctcopy = 4;

    switch (ctremaining) {
      case 1:
        ctcopy = 2;
        break;
      case 2:
        ctcopy = 3;
        break;
    }

    for (i = 0; i < ctcopy; i++)
      [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output]]];

    for (i = ctcopy; i < 4; i++)
      [result appendString: @"="];

    ixtext += 3;
    charsonline += 4;

    if ((length > 0) && (charsonline >= length))
      charsonline = 0;

    return result;
}

@end





原来iphone中已经提供了base64了。
你这样做就可以了:
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonCryptor.h>

+ (NSString *)hmac_sha1:(NSString *)key text:(NSString *)text{

    const char *cKey  = [key cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [text cStringUsingEncoding:NSUTF8StringEncoding];
 
    char cHMAC[CC_SHA1_DIGEST_LENGTH];
 
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
 
    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
    NSString *hash = [Base64 stringByEncodingData:HMAC];//base64 编码。
    [HMAC release];
    return hash;
}


这是rsa加密方法,key是公钥,里面使用了hash算法和base64,base64是3个8位字节(3*8=24)转化为4个6位的字节(4*6=24)
(base64产生的一个原因:在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送Email,这个问题就必须考虑!所以,单单靠改变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046。
基于以上的一些主要原因产生了Base64编码。 )



另外,iphone支持的加解密算法如下:
enum {
    kCCAlgorithmAES128 = 0,
    kCCAlgorithmDES,           
    kCCAlgorithm3DES,         
    kCCAlgorithmCAST,         
    kCCAlgorithmRC4,
    kCCAlgorithmRC2           
};
其中前4个位DES/ADES,后两个位RSA,
DES/ADES加解密使用相同的key
RSA使用公钥加密、私钥解密。


如果只涉及到这几个加密方法
enum {
    kCCAlgorithmAES128 = 0,
    kCCAlgorithmDES,           
    kCCAlgorithm3DES,         
    kCCAlgorithmCAST,         
    kCCAlgorithmRC4,
    kCCAlgorithmRC2           
};
用CCCrypt应该就可以搞定了






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值