W tej chwili waliłem głową w ścianę. Muszę zakodować moją aplikację na iPhone'a, aby zaszyfrować 4-cyfrowy "pinezkę" wykorzystującą 3DES w trybie ECB do transmisji do usługi internetowej, która moim zdaniem jest napisana w .NET.Problem z kluczem szyfrowania 3DES 3D iPhone'a
+ (NSData *)TripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)encryptData {
NSLog(@"kCCKeySize3DES=%d", kCCKeySize3DES);
char keyBuffer[kCCKeySize3DES+1]; // room for terminator (unused)
bzero(keyBuffer, sizeof(keyBuffer)); // fill with zeroes (for padding)
[key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];
// encrypts in-place, since this is a mutable data object
size_t numBytesEncrypted = 0;
size_t returnLength = ([encryptData length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
// NSMutableData* returnBuffer = [NSMutableData dataWithLength:returnLength];
char* returnBuffer = malloc(returnLength * sizeof(uint8_t));
CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES , kCCOptionECBMode,
keyBuffer, kCCKeySize3DES, nil,
[encryptData bytes], [encryptData length],
returnBuffer, returnLength,
&numBytesEncrypted);
if (ccStatus == kCCParamError) NSLog(@"PARAM ERROR");
else if (ccStatus == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL");
else if (ccStatus == kCCMemoryFailure) NSLog(@"MEMORY FAILURE");
else if (ccStatus == kCCAlignmentError) NSLog(@"ALIGNMENT");
else if (ccStatus == kCCDecodeError) NSLog(@"DECODE ERROR");
else if (ccStatus == kCCUnimplemented) NSLog(@"UNIMPLEMENTED");
if(ccStatus == kCCSuccess) {
NSLog(@"TripleDESEncryptWithKey encrypted: %@", [NSData dataWithBytes:returnBuffer length:numBytesEncrypted]);
return [NSData dataWithBytes:returnBuffer length:numBytesEncrypted];
}
else
return nil;
} }
zrobić uzyskać wartość zaszyfrowany przy użyciu powyższego kodu, jednak nie pasuje do wartości z usługi .NET internetowej.
Uważam, że problem polega na tym, że klucz szyfrujący, który dostarczyłem programistom usług internetowych, ma długość 48 znaków.
Widzę, że stała SDK iPhone'a "kCCKeySize3DES" wynosi 24. Więc PODEJMUJĘ, ale nie wiem, że wywołanie API commoncrypto używa tylko pierwszych 24 znaków dostarczonego klucza.
Czy to prawda?
Czy istnieje DOWOLNY sposób, w jaki mogę uzyskać to, aby wygenerować poprawną zaszyfrowaną szpilkę? Mam dane wyjściowe bajtów z szyfrowania PRIOR do kodowania base64 i próbowałem dopasować to do tych wygenerowanych z kodu .NET (przy pomocy programisty .NET, który wysłał mi dane wyjściowe tablicy bajtów). Ani kodowana macierzowa macierz base64, ani końcowe łańcuchy kodowane base64 nie pasują do siebie.
Dziękuję Thomasowi za szczegółową odpowiedź tutaj. Pojęcia, o których wspomniałeś, są dokładnie tym, do czego doszedłem, aby przyjrzeć się bardziej szczegółowo. Miałem szczęście, że miałem dostęp do wersji .NET kodu szyfrowania i to dało mi cenne wskazówki. 4 cyfrowy PIN został zamieniony na 8-cyfrową wartość, która ma zostać wprowadzona do algorytmu 3DES przez dodanie 4 0-tych. Dodałem kod do tej odpowiedzi, ale oznaczono jako rozwiązanie, ponieważ twoja wiedza była całkowicie poprawna. –