2016-03-17 2 views
0

Я делаю шифрование в C# для приложения Windows Phone 8.1, и мне нужно расшифровать его с помощью java. Вот мой Шифрование кодШифрование в C# и дешифрование в Java

public static String encrypt(String plaintext, KeyParameter keyParam) 
    { 
     byte[] ivData = new byte[AES_NIVBITS/8]; 
     Random r = new Random(); 

     r.NextBytes(ivData); 


     IBlockCipherPadding padding = new Pkcs7Padding(); 
     BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), padding); 


     ICipherParameters param = new ParametersWithIV(keyParam, ivData); 
     cipher.Reset(); 
     cipher.Init(true, param); 

     byte[] bytesDec = Encoding.GetEncoding("iso-8859-1").GetBytes(plaintext); 


     byte[] bytesEnc = null; 

     int buflen = cipher.GetOutputSize(bytesDec.Length); 
     System.Diagnostics.Debug.WriteLine("enc length " + buflen); 
     bytesEnc = new byte[buflen]; 
     int nBytesEnc = cipher.ProcessBytes(bytesDec, 0, bytesDec.Length, bytesEnc, 0); 
     nBytesEnc += cipher.DoFinal(bytesEnc, nBytesEnc); 

     if (nBytesEnc != bytesEnc.Length) 
     { 
      throw new Exception("Unexpected behaviour : getOutputSize value incorrect"); 
     } 

     byte[] bytesAll = new byte[ivData.Length + bytesEnc.Length]; 
     Array.Copy(ivData, 0, bytesAll, 0, ivData.Length); 
     Array.Copy(bytesEnc, 0, bytesAll, ivData.Length, bytesEnc.Length); 

     byte[] bytesAllb64 = Base64.Encode(bytesAll); 
     return Encoding.GetEncoding("iso-8859-1").GetString(bytesAllb64, 0, bytesAllb64.Length); 


    } 

И это Java-код для дешифрования

public static String decodeBase64Aes(String encodedciphertext, KeyParameter keyParam) throws Exception 
{ 
    byte[] bytesEnc = Base64.decode(encodedciphertext.getBytes(ISO8859)); 

    int nIvBytes = AES_NIVBITS/8; 
    byte[] ivBytes = new byte[nIvBytes]; 
    System.arraycopy(bytesEnc, 0, ivBytes, 0, nIvBytes); 

    CipherParameters params = new ParametersWithIV(keyParam, ivBytes); 
    BlockCipherPadding padding = new PKCS7Padding(); 
    BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), padding); 

    cipher.reset(); 
    cipher.init(false, params); 

    byte[] bytesDec = null; 

    int buflen = cipher.getOutputSize(bytesEnc.length - nIvBytes); 
    byte[] workingBuffer = new byte[buflen]; 
    int len = cipher.processBytes(bytesEnc, nIvBytes, bytesEnc.length - nIvBytes, workingBuffer, 0); 
    len += cipher.doFinal(workingBuffer, len); 

    bytesDec = new byte[len]; 
    System.arraycopy(workingBuffer, 0, bytesDec, 0, len); 

    return new String(bytesDec, ISO8859); 
} 

Когда я зашифровать его, что он работает нормально, но когда я тестирую дешифрование с использованием зашифрованного текста я получил и ключ, он выбрасывает

Exception in thread "main" org.bouncycastle.crypto.DataLengthException: last block incomplete in decryption 

Я могу изменить только часть C#. Любая помощь будет высоко оценен???

Key -> 8fe3f8b34e87744c175aae43cc52ee13 
'Hello World' -> Nb90n51LqK13LzpalV7qTs7YJqe9m+Ni9uA/U7tU06Y= 

Исключение приходит на линии

len += cipher.doFinal(workingBuffer, len); 

Когда я зашифровать «Hello World» от Java, используя тот же ключ от метода шифрования у меня есть на моем сервере я получаю

uWMz8ZIPh+3jnGtwxpuyK9Qht7BJV4RQ/Iet9JeTrTk= 

EDIT ------

Обновленный рабочий код.

+0

Какие классы Base64 вы используете точно? – vojta

+0

Я использую bouncycastle. –

ответ

0

База 64 не имеет такой же длины, как и оригинал, и именно поэтому я получил эту ошибку. Я обновил код с правильным.

Смежные вопросы