繁体   English   中英

相当于 Java android 中的 CryptoStream .NET?

[英]Equivalent to CryptoStream .NET in Java android?

我有以下函数用于 C# 中字符串的加密和解密。 我需要用相同的密钥和 initvector 在 Java 中解密它。

public const string PASS_PHRASE = "123456789";
private const string initVector = "pemgail9uzpgzl88";
private const int keysize = 256;

public string EncryptString(string plainText)
        {
            byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector);
            byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
            PasswordDeriveBytes password = new PasswordDeriveBytes(PASS_PHRASE, null);
            byte[] keyBytes = password.GetBytes(keysize / 8);
            RijndaelManaged symmetricKey = new RijndaelManaged();
            symmetricKey.Mode = CipherMode.CBC;
            ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            byte[] cipherTextBytes = memoryStream.ToArray();
            memoryStream.Close();
            cryptoStream.Close();
            return Convert.ToBase64String(cipherTextBytes);
        }

public string DecryptString(string cipherText)
        {
            if (string.IsNullOrEmpty(cipherText)) return null;

            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
            PasswordDeriveBytes password = new PasswordDeriveBytes(PASS_PHRASE, null);
            byte[] keyBytes = password.GetBytes(keysize / 8);
            RijndaelManaged symmetricKey = new RijndaelManaged();
            symmetricKey.Mode = CipherMode.CBC;
            ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);
            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);
            CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
            byte[] plainTextBytes = new byte[cipherTextBytes.Length];
            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
            memoryStream.Close();
            cryptoStream.Close();
            return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
        }

这是我在 Java 项目中用于加密/解密的一些代码。 它使用 AES 作为加密算法,但您应该能够弄清楚将其与其他算法一起使用所需的更改。 此外,与 base64 之间的编码/解码也是在这些方法之外进行的。

public static byte[] encryptAes(byte[] messageBytes, byte[] keyBytes, byte[] ivBytes) {
    try {
        IvParameterSpec iv = new IvParameterSpec(ivBytes);
        SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

        byte[] encrypted = cipher.doFinal(messageBytes);
        return encrypted;
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}


public static byte[] decryptAes(byte[] messageBytes, byte[] keyBytes, byte[] ivBytes) {
    try {
        IvParameterSpec iv = new IvParameterSpec(ivBytes);
        SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

        byte[] original = cipher.doFinal(messageBytes);
        return original;
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

无论如何,您可以在此处找到越来越多的具体信息: https ://docs.oracle.com/javase/7/docs/api/javax/crypto/package-summary.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM