2010-12-17 5 views
1

Ich habe eine Java-Klasse, die eine Zeichenfolge verschlüsselt und konvertiert es dann zu Base64, die in einer Android-Anwendung verwendet wird: (Dieser Code wurde von dieses Beispiel (die Räume in dem Hyperlink beachten): http: //stackoverflow.com/ Fragen/2090765/Verschlüsselung-compatable-zwischen-android-and-c)Benötige eine Objective-C-Version von Java Encryption und Base 64 Encoding, die ich bereits habe

public class encryption { 
public static final String TAG = "smsfwd" 
private static Cipher aesCipher; 
private static SecretKey secretKey; 
private static IvParameterSpec ivParameterSpec; 

private static String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding"; 
private static String CIPHER_ALGORITHM = "AES"; 
//the secret key in HEX is 'secretkey' 
private static byte[] rawSecretKey = {Ox73, Ox65, Ox63, Ox72, Ox65, Ox74, Ox6B, Ox65, Ox79}; 

private static String MESSAGEDIGEST_ALGORITHM = "MD5"; 

public encryption(String passphrase) { 
    byte[] passwordKey = encodeDigest(passphrase); 

    try { 
     aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION); 
    } catch (NoSuchAlgorithmException e) { 
     Log.e(TAG, "No such algorithm " + CIPHER_ALGORITHM, e); 
    } catch (NoSuchPaddingException e) { 
     Log.e(TAG, "No such padding PKCS5", e); 
    } 

    secretKey = new SecretKeySpec(passwordKey, CIPHER_ALGORITHM); 
    ivParameterSpec = new IvParameterSpec(rawSecretKey); 
} 




//base 64 encryption 
public String encryptAsBase64(byte[] clearData) { 
    byte[] encryptedData = encrypt(clearData); 
    return base64.encodeBytes(encryptedData); 
} 




public byte[] encrypt(byte[] clearData) { 
    try { 
     aesCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); 
    } catch (InvalidKeyException e) { 
     Log.e(TAG, "Invalid key", e); 
     return null; 
    } catch (InvalidAlgorithmParameterException e) { 
     Log.e(TAG, "Invalid algorithm " + CIPHER_ALGORITHM, e); 
     return null; 
    } 

    byte[] encryptedData; 
    try { 
     encryptedData = aesCipher.doFinal(clearData); 
    } catch (IllegalBlockSizeException e) { 
     Log.e(TAG, "Illegal block size", e); 
     return null; 
    } catch (BadPaddingException e) { 
     Log.e(TAG, "Bad padding", e); 
     return null; 
    } 
    return encryptedData; 
} 

private byte[] encodeDigest(String text) { 
    MessageDigest digest; 
    try { 
     digest = MessageDigest.getInstance(MESSAGEDIGEST_ALGORITHM); 
     return digest.digest(text.getBytes()); 
    } catch (NoSuchAlgorithmException e) { 
     Log.e(TAG, "No such algorithm " + MESSAGEDIGEST_ALGORITHM, e); 
    } 

    return null; 
} 

}

und die Basis 64 Verschlüsselung kommt von (beachten Sie die Leerzeichen im Hyperlink) http: //iharder.sourceforge.net/current/java/base64/

Was passiert ist, dass dies an einen C# /. Net Server zur Entschlüsselung weitergegeben wird und alles funktioniert gut auf dem Android. Das Problem wird jetzt in Objective-C konvertiert, damit es auf dem iPhone verwendet werden kann.

Ich habe eine Menge Forschung und die Antwort erfolgt, die gekommen ist, am nächsten ist http://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/

aber wenn ich das Beispiel (Code direkt aus der heruntergeladenen Zip genommen), erhalte ich einen ‚Padding ungültig und kann nicht entfernt werden. Fehler Server Seite.

Mein Server-Side-Code ist:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using System.Text; 
using System.Security.Cryptography; 

namespace test.Business 
{ 
    public class Crypto 
    { 
     private ICryptoTransform rijndaelDecryptor; 
     // Replace me with a 16-byte key, share between Java and C# 
     private static byte[] rawSecretKey = {Ox73, Ox65, Ox63, Ox72, Ox65, Ox74, Ox6B, Ox65, Ox79}; 

     public Crypto(string passphrase, bool encrypt) 
     { 
      byte[] passwordKey = encodeDigest(passphrase); 
      RijndaelManaged rijndael = new RijndaelManaged(); 
      if(encrypt) 
       rijndaelDecryptor = rijndael.CreateEncryptor(passwordKey, rawSecretKey); 
      else 
       rijndaelDecryptor = rijndael.CreateDecryptor(passwordKey, rawSecretKey); 
     } 

     public Crypto(string passphrase) 
     { 
      byte[] passwordKey = encodeDigest(passphrase); 
      RijndaelManaged rijndael = new RijndaelManaged(); 
      rijndaelDecryptor = rijndael.CreateDecryptor(passwordKey, rawSecretKey); 
     } 

     private string Decrypt(byte[] encryptedData) 
     { 
      byte[] newClearData; 

      try 
      { 
       newClearData = rijndaelDecryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length); 
      } 
      catch 
      { 
       throw; 
      } 
      return Encoding.ASCII.GetString(newClearData); 
     } 

     internal string DecyptString(string token) 
     { 
      //UTF8Encoding utf8 = new UTF8Encoding(); 
      return Decrypt(ASCIIEncoding.ASCII.GetBytes(token)); 
     } 

     internal string DecryptFromBase64(string encryptedBase64) 
     { 
      return Decrypt(Convert.FromBase64String(encryptedBase64)); 
     } 

     private byte[] encodeDigest(string text) 
     { 
      MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      byte[] data = Encoding.ASCII.GetBytes(text); 
      return x.ComputeHash(data); 
     } 


     //Encryption Code 
     public string EncryptAsBase64(string strData) 
     { 
      byte[] clearData = Encoding.ASCII.GetBytes(strData); 
      byte[] encryptedData = Encrypt(clearData); 
      return Convert.ToBase64String(encryptedData); 
     } 

     public byte[] Encrypt(byte[] clearData) 
     { 
      byte[] test1 = new byte[clearData.Length]; 
      try 
      {    
       test1 = rijndaelDecryptor.TransformFinalBlock(clearData, 0, clearData.Length);    
      } 
      catch 
      { 
       throw; 
      } 

      return test1; 
     } 
    } 
} 

Irgendwelche Ideen? Vielen Dank im Voraus!

+0

Ich bin nicht unterbesetzt Warum würden Sie ein Leerzeichen in die Stackoverflow-Verknüpfung einfügen? Versuchen Sie, auf diese Frage zu verweisen oder sie als Beispiel-URL zu verwenden? Was vermisse ich? –

+0

weil ich neu kann ich kann nicht mehr als 1 Hyperlink, so dass es immer noch ich es hacken musste –

+0

Stack-Überlauf war eine große Hilfe für mich in der Vergangenheit und das ist mein erster Beitrag, aber ich wusste nicht, wie man noch zeigen alles, was ich brauchte, ohne eine Tonne Code zu veröffentlichen. Ich entschuldige mich voll und ganz, wenn es scheint, als ob ich irgendwelche Regeln überschreite. Als ich es zum ersten Mal veröffentlichte, stoppte ich mich wegen der Hyperlinks, aber der Grund, den sie gaben, war Spam zu mindern. –

Antwort

0

Sie können eine NSData Kategorie abrufen Base64-Codierung/Decodierung hier zu behandeln: kann

http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html

finden Sie eine Bibliothek und NSData Kategorie hier AES-Verschlüsselung zu tun:

http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

Zwischen den beiden können Sie replizieren, was Sie tun, und wahrscheinlich mit weniger Code ...

+0

danke .. ich werde testen und antworten zurück! –

+0

Entschuldigung für die Verzögerung .. die Basis 64 funktionierte perfekt, aber ich habe immer noch Probleme mit der Verschlüsselung .. Mit anderen Worten, ich benutze CCCryptorStatus Ergebnis = CCCrypt (kCCEncrypt, // verschlüsseln kCCAlgorithmAES128, // verwenden Sie die AES algo kCCOptionPKCS7Padding , // add padding (const void *) [aSymmetricKey Bytes], // md5 verschlüsselter Byte-Schlüssel kCCKeySizeAES256, // Länge des MD5-Schlüssels iv, // Initialisierungsvektor [self bytes], // Daten in [self length], // Länge der Daten in [self mutableBytes], // Daten out [Eigenlänge], // Länge der Daten out & numBytesEncrypted); –

+0

und die .net-Code-Server-Seite kann immer noch nicht entschlüsseln –

Verwandte Themen