3

iOSに暗号化の方法を実装しようとしています。JAVA で実行されているものと一致します。

しかし、私が試したすべてのことは、異なる暗号化されたスキーマになります

ここに私が暗号化に使用する私のJavaコードがあります:

  public static String encrypt(String plaintext)
    throws Exception
  {
    Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
    byte[] encrypted = c.doFinal(plaintext.getBytes("UTF-8"));
    return Base64.encode(encrypted);
  }

目標 c で DESede/CBC/PKCS5Padding を使用する簡単な方法はありますか?

これは私が使用しているコードですが、異なる結果が得られます

+ (NSString*) doCipher:(NSString*)plainText:(CCOperation)encryptOrDecrypt {

    const void *vplainText;
    size_t plainTextBufferSize;

    if (encryptOrDecrypt == kCCDecrypt)
    {
       // NSData *EncryptData = [NSData dataWithBase64EncodedString:plainText];
       // plainTextBufferSize = [EncryptData length];
       // vplainText = [EncryptData bytes];
    }
    else
    {
        NSData *tempData = [plainText dataUsingEncoding:NSASCIIStringEncoding];
        plainTextBufferSize = [tempData length];
        vplainText =  [tempData 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);


    //my shared key i changed to Zeros 
    NSMutableData *payload = [[NSMutableData alloc] init];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
        [payload appendBytes:"00" length:1];
     [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];
    [payload appendBytes:"00" length:1];

    NSString *key = [[NSString alloc]initWithData:payload encoding:NSUTF8StringEncoding];

//my iV i changed it to zeros 
    NSMutableData *IV = [[NSMutableData alloc] init];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];
    [IV appendBytes:"00" length:1];

    NSLog(@"key byte is %s", [payload bytes]);
     NSLog(@"IV byte is %s", [IV bytes]);
    // Initialization vector; dummy in this case 0's.
    uint8_t iv[kCCBlockSize3DES];
    memset((void *) iv, 0x0, (size_t) sizeof(iv));

    ccStatus = CCCrypt(encryptOrDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       (const void *)[payload bytes], //"123456789012345678901234", //key
                       kCCKeySize3DES,
                       [IV bytes],  //iv,
                       vplainText,  //plainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    //if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
    /*else*/ if (ccStatus == kCCParamError) 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:NSASCIIStringEncoding]];
        result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding];
    }
    else
    {
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        NSLog(@"data is: %@", myData);
        result = [myData base64EncodedString];
      //  result = [[NSString alloc]initWithData:myData encoding:NSUTF8StringEncoding];
    }
    return result;
}
4

2 に答える 2

3

@owlstead ヒントをありがとう、

私は本当にすべてをチェックしました、そしてあなたは正しいです問題は入力にありました

入力を入力する正しい方法は次のとおりです。

  unsigned char result1[24]=      {0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,00,00,00,00,0};
    unsigned char IV3[8]={0,0,0,0,0,0,0,0};

もちろん、数字を独自のキーと IV に変更する必要があります。

完全なコード: IV と結果をデータに変更するだけです :)

    - (NSString*) doCipher:(NSString*)plainText enc:(CCOperation)encryptOrDecrypt{

    const void *vplainText;
    size_t plainTextBufferSize;





    if (encryptOrDecrypt == kCCDecrypt)
    {
        NSData *EncryptData =[NSData  dataWithBase64EncodedString:plainText];
        plainTextBufferSize = [EncryptData length];
        vplainText = [EncryptData bytes];
    }
    else
    {
        plainTextBufferSize = [plainText length];
        vplainText = (const void *) [plainText UTF8String];
    }


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


    unsigned char result1[24]= {0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,00,00,00,00,0};
    unsigned char IV3[8]={0,0,0,0,0,0,0,0};

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

    ccStatus = CCCrypt(encryptOrDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding ,
                       result1, //"123456789012345678901234", //key
                       kCCKeySize3DES,
                       IV3 ,  //iv,
                       vplainText,  //plainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    //if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
    /*else*/ if (ccStatus == kCCParamError) 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:NSASCIIStringEncoding];

    }
    else
    {
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        NSLog(@"data is: %@", myData);
        result = [NSData base64StringFromData:myData length:myData.length];
        //  result = [[NSString alloc]initWithData:myData encoding:NSUTF8StringEncoding];
    }
    return result;
}
于 2013-06-02T08:36:27.760 に答える