java - 相互互換性のためにC#暗号化をJava(Android)暗号化に変換するヘルプ

原文 java c# android encryption cross-platform

私はこのクラス(私のc#アプリでこれを数年使用してきた)をAndroidアプリケーションで使用するためにJavaに変換しようとしました:https://gist.github.com/jbtule/4336842#file-aesthenhmac-cs

私が問題を抱えているいくつかの領域は、MemoryStream、CryptoStream、より具体的には次のようなものです:

//C# CODE
//Grab IV from message
var iv = new byte[ivLength];
Array.Copy(encryptedMessage, nonSecretPayloadLength, iv, 0, iv.Length);

using (var decrypter = aes.CreateDecryptor(cryptKey, iv))
using (var plainTextStream = new MemoryStream())
{
    using (var decrypterStream = new CryptoStream(plainTextStream, decrypter, CryptoStreamMode.Write))
    using (var binaryWriter = new BinaryWriter(decrypterStream))
    {
        //Decrypt Cipher Text from Message
        binaryWriter.Write(
            encryptedMessage,
            nonSecretPayloadLength + iv.Length,
            encryptedMessage.Length - nonSecretPayloadLength - iv.Length - sentTag.Length
        );
    }
    //Return Plain Text
    return plainTextStream.ToArray();
}


JavaがCryptoStreamまたはMemoryStreamに相当するものはよくわかりません。

私がこれまでに得たもの(クラス全体ではなく、このコード例に関して)

//Grab IV from message
byte[] iv = new byte[ivLength];
System.arraycopy(encryptedMessage, nonSecretPayloadLength, iv, 0, iv.length);

Cipher aes = Cipher.getInstance("AES/CBC/PKCS7Padding");
// MISSING: create IvParameterSpec
IvParameterSpec ivSpec = new IvParameterSpec(iv);
iv = ivSpec.getIV();

aes.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivSpec);

//byte[] decoded = aes.doFinal(Base64.decodeBase64(encryptedMessage));

ByteArrayOutputStream decrypterStream = new ByteArrayOutputStream();
DataOutputStream binaryWriter = new DataOutputStream(decrypterStream);

        binaryWriter.write(
                encryptedMessage,
                nonSecretPayloadLength + iv.length,
                encryptedMessage.length - nonSecretPayloadLength - iv.length - sentTag.length
        );


誰かが私にいくつかのポインタ/ヘルプIDを与えることができれば最も感謝しています。
答え
これは私がこのコードのために思いついた実装です:

try (ByteArrayOutputStream plainTextStream = new ByteArrayOutputStream()) 
{
    // -- c# like CryptoStream
    try (CipherOutputStream decrypterStream = 
             new CipherOutputStream(plainTextStream, cipher)) 
    {
        // -- binaryWriter like c#
        try (DataOutputStream binaryWriter = new DataOutputStream(decrypterStream)) 
        {
            // -- Encrypt Data
            //Decrypt Cipher Text from Message
            binaryWriter.write(encryptedMessage,
                               nonSecretPayloadLength + iv.length,
                               encryptedMessage.length 
                                 - nonSecretPayloadLength 
                                 - iv.length 
                                 - sentTag.length);
        }

        //Return Plain Text
        //decrypterStream.flush();

    } finally {
        return plainTextStream.toByteArray();
    }

} catch (IOException e) {
    e.printStackTrace();
}
関連記事

java - RESTfulアプリの設計…Java Webアプリのうち

java - Mac OS X YosemiteでのNetLogo R拡張機能のインストールエラー

java - 自動vsカスタムLuceneスコアリング

java - Atomikos、Tomcat、トランザクションログ、システムプロパティを監視しない

java - Javaを使用して独自のカスタムフォントを作成することはできますか?

java - Java同期の待機および通知メソッド

java - Spring Candidate Bean Type Strategyは、修飾子をチェックする前に、指定されたタイプのすべてのBeanをインスタンス化しないでください

java - appengine内でのsqliteファイルの作成

java - GXT円グラフで色を選択する

java - Hibernate ValidatorでSpringリソースバンドルを使用する