java - 相当于 Java android 中的 CryptoStream .NET?
问题描述
Tengo las siguientes funciones para encriptar y desencriptar un string en C#, y necesito desencriptarlo en java con la misma key e initvector。
我有以下函数用于 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
推荐阅读
- r - 计算具有相邻值的行组之间的统计差异
- html - 居中 React-Grid-Gallery ReactJS 库
- javascript - Microsoft.Maps.TileSource 回调的凭据
- c# - 将XML转成JSON反序列化成类
- epoch - Epoch 秒到日期/时间转换,不使用 C 库函数
- sql - 如何使用多选优化 SQL 查询
- python - 将基于公共索引的数据与日期结合起来
- floating-point - IEEE 754 标准中的零点一
- rasa-nlu - 如何使用 rasa action_restart
- sql - SQL Developer - 我如何让 MAX 和 AVG 从一列中提取并过滤它们自己?