【发布时间】:2014-11-29 02:53:33
【问题描述】:
我一直在尝试将这个类(已经在我的 c# 应用程序中使用它几年了)转换为 java 以在 android 应用程序中使用: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
);
如果有人能给我一些指点/帮助,不胜感激。
【问题讨论】:
-
CryptoStream 等效项应该是
CipherOutputStream-MemoryStream是ByteArrayOutputStream。
标签: java c# android encryption cross-platform