【问题标题】:Need help converting c# encryption to java (android) encryption for cross compatibility需要帮助将 c# 加密转换为 java (android) 加密以实现交叉兼容性
【发布时间】: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 - MemoryStreamByteArrayOutputStream

标签: java c# android encryption cross-platform


【解决方案1】:

这是我为这段代码想出的实现:

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();
}

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2020-07-31
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多