2016-12-19 16 views
6

Tôi hiện đang sử dụng sau đây để giải mã Triple DES trên iOS:Triple DES giải mã trong iOS

NSString* plainText = @"My Text"; 
    NSString* keyText = @"cf6f1ed3bf0a156e"; 

    NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding]; 

    size_t bufferSize = plainData.length + kCCBlockSize3DES; 
    NSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize]; 
    size_t movedBytes = 0; 

    CCCryptorStatus ccStatus; 
    ccStatus = CCCrypt(kCCDecrypt, 
      kCCAlgorithm3DES, 
      kCCOptionECBMode, 
      keyData.bytes, 
      kCCBlockSize3DES, 
      NULL, 
      plainData.bytes, 
      plainData.length, 
      cypherData.mutableBytes, 
      cypherData.length, 
      &movedBytes); 

    cypherData.length = movedBytes; 

    if(ccStatus == kCCSuccess) { 
     NSLog(@"Data: %@",cypherData); 
     NSLog(@"Data encoded string: %@",[NSString stringWithUTF8String:[cypherData bytes]]); 
     NSLog(@"Data encoded: %@",[[NSString alloc] initWithData:cypherData encoding:NSUTF8StringEncoding]); 
    } else { 
     NSLog(@"Failed DES decrypt ..."); 
     return nil; 
    } 

Tuy nhiên, tôi tiếp tục nhận được sau trong giao diện điều khiển:

dữ liệu: Dữ liệu chuỗi được mã hóa: (null) Dữ liệu được mã hóa: (null)

Bất kỳ ý tưởng nào về lý do tại sao điều này xảy ra? Bất cứ ai có thể nhìn thấy bất kỳ vấn đề có thể với mã này?

Trả lời

2

Thay đổi thông báo lỗi tới:

NSLog(@"Failed DES decrypt, status: %d", ccStatus); 

Bạn sẽ thấy một tình trạng -4300 và tìm thấy trong CommonCryptoError.h tìm:
kCCParamError = -4300
@constant kCCParamError Illegal parameter value.

lỗi Status có thể là bạn của bạn nếu bạn đừng bỏ qua chúng.

  1. Bạn đang chỉ định 3DES phải có độ dài khóa là 24 byte, bạn đang cung cấp 16 byte. Bạn có thể nên thay đổi thành kCCAlgorithmDESkCCBlockSizeDES (xem điểm tiếp theo). Nhưng khóa có thể được mã hóa hex và cần phải được giải mã thành 8 byte.

  2. Trong cuộc gọi, tham số thứ 5 là size_t keyLength nhưng bạn đang cung cấp kCCBlockSize3DES là 8 byte. Kích thước khóa và khóa không nhất thiết phải cùng kích thước.

  3. Không đệm là mặc định và điều đó có nghĩa là các dữ liệu được mã hóa phải là một chính xác bội số của kích thước khối (8-byte). Thêm một byte khác vào dữ liệu đầu vào hoặc chỉ định kCCOptionPKCS7Padding làm tùy chọn.

  4. Nói chung, không thể biểu thị kết quả mã hóa trực tiếp trong chuỗi ký tự, đặc biệt không phải là biểu diễn UTF-8 — có các giá trị byte không hiển thị được. Vì lý do này, nếu bạn cần một chuỗi ký tự chuỗi hoặc Base64 hoặc hệ thập lục phân thường được sử dụng.

Lưu ý: Có khả năng khóa là 16 byte và 3DES hai phím là cần thiết, trong trường hợp đó trùng lặp và chắp thêm 8 byte đầu tiên vào khóa cần tạo là khóa 3DES 24 byte . Bạn cần phải hiểu thấu thuật toán, khóa và tùy chọn.

công trình đang

Ví dụ này nhưng không phải là tối ưu cũng không an toàn nhưng một điểm khởi đầu để giúp bạn đi:

Bạn có thể thay đổi điều này để 3DES bằng cách cung cấp một phím 24-byte và thay đổi kCCAlgorithmDES-kCCAlgorithm3DESkCCKeySizeDES-kCCKeySize3DES

NSString* plainText = @"My Text-"; 
NSString* keyText = @"cf6f1ed3"; 

NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding]; 

size_t bufferSize = plainData.length + kCCBlockSizeDES; 
NSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize]; 
size_t movedBytes = 0; 

CCCryptorStatus ccStatus; 
ccStatus = CCCrypt(kCCDecrypt, 
        kCCAlgorithmDES, 
        kCCOptionECBMode, 
        keyData.bytes, 
        kCCKeySizeDES, 
        NULL, 
        plainData.bytes, 
        plainData.length, 
        cypherData.mutableBytes, 
        cypherData.length, 
        &movedBytes); 

cypherData.length = movedBytes; 

if(ccStatus == kCCSuccess) { 
    NSLog(@"Data: %@"encoded,cypherData); 
} else { 
    NSLog(@"Failed DES decrypt, status: %d", ccStatus); 
} 

Nhưng vì lý do bảo mật, sử dụng AES với IV ngẫu nhiên, nếu có thể sử dụng RNCryptor, nó sẽ giải quyết mọi chi tiết khó chịu nhưng quan trọng đối với bạn.

+0

sẽ không bao giờ nghĩ đến các khóa là vấn đề. Cảm ơn đã giúp đỡ – user481610

3

Khóa của bạn dài 16 byte. 3DES mất một khóa dài 24 byte (nhờ Zaph để sửa; cũng lưu ý rằng bạn chỉ đọc 8 byte). Điều này có thể không gây ra lỗi này, nhưng có nghĩa là chìa khóa không phải là điều bạn nghĩ.

Một chuỗi các chữ số thập phân trong một chuỗi chỉ là giá trị UTF-8. "00" không phải là 0x00, 0x00. Đó là 0x30, 0x30.

Lý do bạn đang nhận được (null) đây là thế này:

NSLog(@"Data encoded string: %@",[NSString stringWithUTF8String:[cypherData bytes]]); 

đầu ra Cryptographic là rất không phải là một pháp lý chuỗi UTF-8. Nếu bạn muốn mã hóa dữ liệu ngẫu nhiên dưới dạng chuỗi, bạn cần mã hóa như mã hóa hex hoặc mã hóa Base64. Base64 được tích hợp sẵn và bạn có thể sử dụng [NSData base64EncodedStringWithOptions:] để mã hóa nó.

Các vấn đề liên quan