私はこのクラス(私の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();
}