2

私はiOS開発と目的cにかなり慣れていません。暗号化されたデータをサーバーに送信するアプリケーションを開発しています。サーバーは、cbc 付きでパディングなしの 3des を使用します。関連する質問のほとんどをstackoverflowで読みましたが、まだ機能しません。これに数日間取り組んでいますが、サーバーの暗号化と一致させることができません。

これが私が解決したものです:

NSString* plaintexthex = @"536176696E67204163636F756E747C313233343536000000";
NSData *dTextIn = [self dataFromHexString:plaintexthex]; //my own way of convert hex to data

NSString* keyhex = @"6E7B336FD2051BA165A9362BD9735531";
NSData *_keyData = [self dataFromHexString:keyhex]; //my own way of convert hex to data

CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;

bufferPtrSize = ([dTextIn length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x00, bufferPtrSize);

uint8_t iv[kCCBlockSize3DES];
memset((void *) iv, 0x00, (size_t) sizeof(iv));

unsigned char *bytePtr = (unsigned char *)[_keyData bytes];

ccStatus = CCCrypt(kCCEncrypt,              // CCoperation op
                   kCCAlgorithm3DES,        // CCAlgorithm alg
                   kCCModeCBC,              // CCOptions
                   [_keyData bytes],        // const void *key
                   kCCKeySize3DES,          // 3DES key size length 24 bit
                   iv,                      // const void *iv,
                   [dTextIn bytes],         // const void *dataIn 
                   [dTextIn length],        // size_t dataInLength
                   bufferPtr,               // void *dataOut
                   bufferPtrSize,           // size_t dataOutAvailable
                   &movedBytes);            // size_t *dataOutMoved

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

NSLog(@"Data to encrypt %@",dTextIn);
NSLog(@"Encryption key %@",_keyData);
NSLog(@"Bytes of key are %s ", bytePtr);
NSLog(@"Key length %d ",[_keyData length]);
NSLog(@"Encrypted bytes %@", myData);
NSLog(@"Encrypted string %@", result);
NSLog(@"Encrypted string length %d", [result length]);

- (NSData *)dataFromHexString:(NSString *)string 
{   
    NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [string length] / 2; i++) {
        byte_chars[0] = [string characterAtIndex:i*2];
        byte_chars[1] = [string characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [stringData appendBytes:&whole_byte length:1]; 
    }
    return stringData;
}

Android プラットフォームで同様のアプリケーションを開発しましたが、サーバーでうまく動作します。Android プラットフォームで使用した関数の暗号化を次に示します。

public byte[] encrypt(byte[] key, byte[] message) throws Exception {

       byte [] plainTextBytes = message;
       byte[] encryptKey = key;

       SecretKey theKey = new SecretKeySpec(encryptKey, "DESede");
       Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
       IvParameterSpec IvParameters = new IvParameterSpec(new byte[] {(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00});
       cipher.init(Cipher.ENCRYPT_MODE, theKey, IvParameters);
       byte[] encrypted = cipher.doFinal(plainTextBytes);
       return encrypted;
  }

基本的に、iOS プラットフォームで使用するために、この同様の暗号化を複製したいと考えています。どんな助けでも大歓迎です。事前に感謝します。

4

2 に答える 2

1

kCCModeCBCはモードであり、オプションではありません。欲しいオプションは0. のデフォルト モードは CBC ですCCCrypt()。デフォルトもパディングなしです。

于 2012-08-18T22:37:31.547 に答える
0

私は開発者ではなく iOS ユーザーですが、私の知る限り、iOS は 3DES をサポートしなくなりました。私は VPN に iPad を使用しており、iOS 3 は 3DES 暗号化で問題なく動作しましたが、iOS 4 の時点で必要な最小暗号化レベルは AES128 です。

それが役立つことを願っています。

于 2013-04-26T19:53:19.070 に答える