2016-06-26 9 views
0

Hallo Ich baue eine iOS-Anwendung, die mit einem erholsamen Server kommuniziert. Dies erfordert meinen Java AES Code und Swift AES Code, um die gleichen Ergebnisse zu erzielen, die ich derzeit CryptoSwift benutze, unter Verwendung des Tutorials hier (AES Encrypt and Decrypt). Dies gibt mir jedoch andere Ergebnisse im Vergleich zu meinem Java-Code.Swift AES implmentation

Dies ist mein Java-Code:

private static final byte[] keyValue = new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' }; 

public static String encrypt(String Data) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance("AES"); 
    c.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encVal = c.doFinal(Data.getBytes()); 
    String encryptedValue = new BASE64Encoder().encode(encVal); 
    return encryptedValue; 
} 

public static String decrypt(String encryptedData) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance("AES"); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 
    byte[] decValue = c.doFinal(decordedValue); 
    String decryptedValue = new String(decValue); 
    return decryptedValue; 
} 

public static Key generateKey() throws Exception { 
    Key key = new SecretKeySpec(keyValue, "AES"); 
    return key; 
} 

public static void main(String[] args) { 
    try { 
     System.out.println(AES.encrypt("test")); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Dieser Code gibt mir xGdooY + 6V8q1cze7mR9TjQ ==

Hier ist mein Code swift in

import Foundation 
import CryptoSwift 

extension String { 
func aesEncrypt(key: String, iv: String) throws -> String{         
    let data = self.dataUsingEncoding(NSUTF8StringEncoding) 
    let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes()) 
    let encData = NSData(bytes: enc, length: Int(enc.count)) 
    let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)); 
    let result = String(base64String) 
    return result 
} 

func aesDecrypt(key: String, iv: String) throws -> String { 
    let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0)) 
    let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes()) 
    let decData = NSData(bytes: dec, length: Int(dec.count)) 
    let result = NSString(data: decData, encoding: NSUTF8StringEncoding) 
    return String(result!) 
} 
} 

    let key = "TheBestSecretKey" // length == 32 
    let iv = "gqLOHUioQ0QjhuvI" // length == 16 
    let s = "test" 
    let enc = try! s.aesEncrypt(key, iv: iv) 
    let dec = try! enc.aesDecrypt(key, iv: iv) 
    print(s) 
    print("enc:\(enc)") 
    print("dec:\(dec)") 
    print("\(s == dec)") 

Dieser Code gibt mir LQu3c4HaOQf7W0CfnMMy1w ==

Wie Sie sehen können, funktionieren sie unabhängig, aber ich brauche sie zu comp atible

+0

Was bedeutet iv (Initialisierungsvektor) und wie bekommt man es? –

Antwort

4

Sie machen zwei verschiedene Arten der Verschlüsselung.
Ihr Java-Code verwendet die AES-Chiffre, die genauer AES/ECB/PKCS5Padding ist, während Ihr schneller Code das Äquivalent von AES/CBC/PKCS5Padding tut und eine IV verwendet.
Mit anderen Worten, Ihr Swift-Code führt eine Chiffrierblockverkettung durch und verwendet einen Initialisierungsvektor. Während Ihr Java-Code den ECB-Modus ohne IV ausführt.
Wenn Sie nicht wissen, was Sie tun, sollten Sie keine Verschlüsselungsschemata implementieren, aber Sie sollten zumindest eine zufällige IV- und Chiffrierungsblockverkettung verwenden.
Sie sollten den ECB-Modus niemals verwenden.
Wenn Sie eine zufällige IV verwenden, wird jedes Mal, wenn Sie etwas verschlüsseln, das Ergebnis anders sein.
Anstatt zu überprüfen, ob die Chiffretexte identisch sind, sollten Sie testen, ob Sie Nachrichten zwischen den einzelnen Komponenten verschlüsseln/entschlüsseln können.

+0

Danke für Ihre Hilfe, ich glaube, ich habe verstanden, was Sie sagen. Verschlüsselung ist jedoch kein großes Element meiner Anwendung, daher muss ich nicht perfekt sein. Ich brauche es nur, um zu funktionieren, ohne Informationen im Klartext hin und her senden zu müssen. Gibt es eine Bibliothek oder einen existenten Code, den ich für Swift oder Java verwenden kann? –

+1

Ich weiß nicht, was Ihre Anforderungen sind, aber die einfachste, am wenigsten fehleranfällige Methode zum Senden verschlüsselter Daten zwischen einem Client und einem Server wäre die Verwendung von HTTPS. – Magnus

+0

Eine gute plattformübergreifende Lösung ist die Verwendung von [RNCryptor] (https://github.com/RNCryptor) mit Versionen für mehrere Plattformen/Sprachen. Weiterhin wird eine authentifizierte Verschlüsselung und ein Passwort zur Schlüsselableitung bereitgestellt. Es behandelt die verschiedenen Details, die schwer zu korrigieren sind. – zaph