Hallo zusammen,
ich muß Dateien/Text verschlüsseln bzw. entschlüsseln die mit folgenden Java Code generiert bzw. wieder entschlüsselt werden (MacOSX <=> java Applikation): Hier der Java-Code:
Alles anzeigen
In Objective-C versuche ich jetzt die gleiche Verschlüsselung/Entschlüsselung hinzubekommen, bei der Verschlüsselung bekomme ein Anderen Ausgabe String: Hier der Objective-C Code:
Alles anzeigen
(Erweiterung für NSData) und rufe folgende Funktionen auf:
Alles anzeigen
Ausgabe Obj-C: tyjRv4y7aIE2fMlFRHje9w==
Mein Problem jetzt, Java und Objective-C liefern mir unterschiedliche Ausgaben für das Verschlüsseln. Die Anforderungen laut Java-Code: AES-256-CBC, mit einem Key von 16Byte und dem IV mit 16Byte, diese Angaben sind auf beiden Seiten gleich, meine ich ...
Hat jemand schon ein ähnlichen problem gehabt oder sieht den Fehler, den ich vor lauter Bäumen wahrscheinlich nicht sehe ...
Danke ...
ich muß Dateien/Text verschlüsseln bzw. entschlüsseln die mit folgenden Java Code generiert bzw. wieder entschlüsselt werden (MacOSX <=> java Applikation): Hier der Java-Code:
Quellcode
- try {
- String text = "Test";
- String pw = "1234567812345678";
- String iv = "1234567812345678";
- byte[] data = text.getBytes("UTF-8");
- Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS5Padding" );
- Key key = new SecretKeySpec( pw.getBytes("UTF-8"),0,16, "AES" ); // key muss 16 Byte lang sein !
- IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8") );
- cipher.init(Cipher.ENCRYPT_MODE, key , ivParameterSpec);
- byte[] verschlüsselt = cipher.doFinal( text.getBytes("UTF8") );
- String encryptedString = new String(Base64.getEncoder().encode(verschlüsselt),"UTF-8");
- System.out.println(encryptedString);
- //outout: yhkFI8IuDFpT62URI28XlQ==
- }
- catch(Exception e) {
- System.out.println("Es ist ein Fehler aufgetreten:");
- e.printStackTrace();
- }
In Objective-C versuche ich jetzt die gleiche Verschlüsselung/Entschlüsselung hinzubekommen, bei der Verschlüsselung bekomme ein Anderen Ausgabe String: Hier der Objective-C Code:
Quellcode
- @implementation NSData (MyCrypt)
- #define key @"1234567812345678"
- #define iv @"1234567812345678"
- - (NSData *) cryptOperation:(CCOperation)operation
- {
- // 'key' should be 32 bytes for AES256, will be null-padded otherwise
- //char keys[kCCKeySizeAES256 + 1];
- char keys[16 + 1];
- [key getCString:keys maxLength:sizeof(keys) encoding:NSUTF8StringEncoding];
- // Perform PKCS7Padding on the key.
- unsigned long bytes_to_pad = sizeof(keys) - [key length];
- if (bytes_to_pad > 0)
- {
- char byte = bytes_to_pad;
- for (unsigned long i = sizeof(keys) - bytes_to_pad; i < sizeof(keys); i++)
- keys[i] = byte;
- }
- NSUInteger dataLength = [self length];
- //See the doc: For block ciphers, the output size will always be less than or
- //equal to the input size plus the size of one block.
- //That's why we need to add the size of one block here
- size_t bufferSize = dataLength + kCCBlockSizeAES128;
- void *buffer = malloc(bufferSize);
- size_t numBytesDecrypted = 0;
- CCCryptorStatus status = CCCrypt(operation, kCCAlgorithmAES128,kCCOptionPKCS7Padding,
- keys,kCCKeySizeAES256,
- [iv UTF8String],
- [self bytes], dataLength, /* input */
- buffer, bufferSize, /* output */
- &numBytesDecrypted);
- if (status == kCCSuccess)
- {
- //the returned NSData takes ownership of buffer and will free it on dealloc
- return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
- }
- free(buffer); //free the buffer;
- return nil;
- }
- - (NSData *)AES256Encrypt
- {
- return [self cryptOperation:kCCEncrypt];
- }
- - (NSData *)AES256Decrypt
- {
- return [self cryptOperation:kCCDecrypt];
- }
(Erweiterung für NSData) und rufe folgende Funktionen auf:
Quellcode
- // Auszug ...
- + (NSString *)encrypt:(NSString *)string
- {
- NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
- NSData *dataEncrypted = [data AES256Encrypt];
- NSString *strRecordEncrypted = [dataEncrypted base64EncodedStringWithOptions:0];
- return strRecordEncrypted;
- }
- + (NSString *)decrypt:(NSString *)string
- {
- if([string containsString:@"\n"] || [string containsString:@"\t"])
- {
- string = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@""];
- string = [string stringByReplacingOccurrencesOfString:@"\t" withString:@""];
- }
- NSData *keyData = [[NSData alloc] initWithBase64EncodedString:string options:0];
- NSData *dataDecrypted = [keyData AES256Decrypt];
- NSString *receivedDataDecryptString = [[NSString alloc]initWithData:dataDecrypted encoding:NSUTF8StringEncoding];
- return receivedDataDecryptString;
- }
- - (IBAction)doCryptAction:(id)sender {
- NSString *text = [self.textField stringValue];
- NSString *crypt = [MyCrypt encrypt:text];
- [self.cryptTextField setStringValue:crypt];
- }
- - (IBAction)decyrpytAction:(id)sender {
- NSString *crypt = [self.cryptTextField stringValue];
- NSString *decrypt = [MyCrypt decrypt:crypt];
- [self.decrypttextField setStringValue:decrypt];
- }
Ausgabe Obj-C: tyjRv4y7aIE2fMlFRHje9w==
Mein Problem jetzt, Java und Objective-C liefern mir unterschiedliche Ausgaben für das Verschlüsseln. Die Anforderungen laut Java-Code: AES-256-CBC, mit einem Key von 16Byte und dem IV mit 16Byte, diese Angaben sind auf beiden Seiten gleich, meine ich ...
Hat jemand schon ein ähnlichen problem gehabt oder sieht den Fehler, den ich vor lauter Bäumen wahrscheinlich nicht sehe ...

Danke ...
Si tacuisses, philosophus mansisses !