2016-04-04 3 views
0

Ich habe eine Anwendung in C# verschlüsselt wurden, dass meine Dateien mit AES-Algorithmus mit dieser Methode zu verschlüsseln:Wie kann ich Datei in ios entschlüsseln, die in C# Rijndael mit

private static void encryptFile(string inputFile, string outputFile, string strKey) 
{ 
    try 
    { 
    using (RijndaelManaged aes = new RijndaelManaged()) 
    { 
     byte[] key = Encoding.UTF8.GetBytes(strKey); 
     byte[] IV = Encoding.UTF8.GetBytes(strKey); 

     using (FileStream fsCrypt = new FileStream(outputFile, FileMode.Create)) 
     { 
     using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV)) 
     { 
      using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write)) 
      { 
      using (FileStream fsIn = new FileStream(inputFile, FileMode.Open)) 
      { 
       int data; 
       while ((data = fsIn.ReadByte()) != -1) 
       { 
       cs.WriteByte((byte)data); 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    Debug.WriteLine(ex.Message); 
    } 
} 

Die Datei ohne ein Problem verschlüsselt ist.

Dann möchte ich die verschlüsselte Datei mit meiner Android (2.2) -Anwendung entschlüsseln. So mache ich das:

private void decriptFile() throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { 
     //byte[] docBytes = serialize(myDoc); 
     byte[] b = new byte[0]; 
     try { 
      Resources res = getResources(); 
      InputStream in_s = res.openRawResource(R.raw.output27); 

      b = new byte[in_s.available()]; 
      in_s.read(b); 
      //txtHelp.setText(new String(b)); 
     } catch (Exception e) { 
      // e.printStackTrace(); 
      //txtHelp.setText("Error: can't show help."); 
     } 

     //byte[] dataBytes = FileUtils.readFileToByteArray(File file); 
     byte[] key = new byte[0]; 
     try { 
      // key = ("HR$2pIjHR$2pIj12").getBytes("UTF-8"); 
      key = ("HR$2pIjHR$2pIj12").getBytes("UTF-8"); 
      Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      SecretKeySpec k = new SecretKeySpec(key, "AES"); 
      IvParameterSpec iv = new IvParameterSpec(key); 
      c.init(Cipher.DECRYPT_MODE, k, iv); 

      // IllegalBlockSizeException Occurred 

      //File folder = new File(Environment.getExternalStorageDirectory(), 
        //"test"); 
      File folder = new File("/sdcard", 
        "test"); 
      if (!folder.exists()) { 
       folder.mkdir(); 
      } 

      byte[] decryptedDocBytes = c.doFinal(b); 
      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(folder.getPath()+"/test.epub")); 
      bos.write(decryptedDocBytes); 
      bos.flush(); 
      bos.close(); 
      //DocumentsContract.Document decryptedDoc = (DocumentsContract.Document)deserialize(decryptedDocBytes); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     //IvParameterSpec iv = new IvParameterSpec(key); 



     //And my serialize/deserialize methods: 
    } 

Dieses Mal Entschlüsselung funktioniert fine.For in Objective C gleiche Datei zu entschlüsseln ich die folgende Methode verwenden:

- (NSData *)decrypt:(NSData *)plainText key:(NSData *)aSymmetricKey padding:(CCOptions *)pkcs7 
{ 
    //return [self doCipher:plainText key:aSymmetricKey context:kCCDecrypt padding:pkcs7]; 
    return [self doCipher2:plainText iv:[self generateRandomIV:128] key:aSymmetricKey context:kCCDecrypt error:nil]; 
} 

- (NSData *)doCipher2:(NSData *)dataIn 
        iv:(NSData *)iv 
       key:(NSData *)symmetricKey 
      context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt 
       error:(NSError **)error 
{ 
    CCCryptorStatus ccStatus = kCCSuccess; 
    size_t   cryptBytes = 0; 
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 

    ccStatus = CCCrypt(encryptOrDecrypt, 
         kCCAlgorithmAES128, 
         0, //kCCOptionPKCS7Padding, 
         symmetricKey.bytes, 
         kCCKeySizeAES128, 
         iv.bytes, 
         dataIn.bytes, 
         dataIn.length, 
         dataOut.mutableBytes, 
         dataOut.length, 
         &cryptBytes); 

    if (ccStatus == kCCSuccess) { 
     dataOut.length = cryptBytes; 
    } 
    else { 
     if (error) { 
      *error = [NSError errorWithDomain:@"kEncryptionError" 
             code:ccStatus 
            userInfo:nil]; 
     } 
     dataOut = nil; 
    } 

    return dataOut; 
} 

Zeit keine luck.What das Problem sein könnte ?? Jede Hilfe wäre willkommen.

+2

"Rijndael", wie auf dem Titel erwähnt. –

+0

Hallo, ich habe detaillierten Code –

+0

hinzugefügt Es ist eine sehr schlechte Idee, den Verschlüsselungsschlüssel auch als IV zu verwenden. – zaph

Antwort

0

In der Android-Version geben Sie PKCS5Padding an, aber kein Auffüllen der iOS-Version. Beachten Sie, dass PKCS5Padding und PKCS7Padding auf die gleiche Sache, gibt es nur einen Unterschied Definition.

Wechsel:

0, //kCCOptionPKCS7Padding, 

zu

kCCOptionPKCS7Padding, 
+0

funktioniert nicht mit dieser Änderung –

+0

Geben Sie Beispieleingänge und -ausgänge in hex ein. Das Problem wird sein, dass die Eingaben nicht gleich sind. – zaph

+0

thanks.this Zeit funktioniert, aber in meiner Textdatei zuerst einige Welten können nicht entschlüsselt werden, aber Rest Wörter richtig entschlüsselt.Was ist das Problem? irgendeine Idee? Ich habe 128 Tastengröße verwendet. –

Verwandte Themen