作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为我们项目的一部分,我必须解密用 C# 加密的字符串。该解密是使用 AES 算法和 PKCS7 打包模式完成的。为了生成初始化 vector ,他们使用了以下内容:
Rfc2898DeriveBytes keyGenerator = new Rfc2898DeriveBytes("somestring", salt);
盐是默认字节。
此 IV 用于使用 AES 加密字符串。
我翻阅了一些文档,发现AES可以用Java实现。但不知道如何通过 IV 和打包模式。
此外,我还看到有 CBC、ECB 模式用于提及密码 block 模式。我不确定 C# 对应部分使用什么模式。
下面是C#代码
/// Method to encrypt the plain text based on the key and Iv
/// </summary>
/// <param name="plainText"></param>
/// <param name="key"></param>
/// <returns>encrypted Text</returns>
private string Encrypt(string plainText, byte[] key)
{
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (key == null || key.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the stream used to encrypt to an in memory
// array of bytes.
MemoryStream msEncrypt = null;
// Declare the RijndaelManaged object
// used to encrypt the data.
AesCryptoServiceProvider aesAlg = null;
// using (new Tracer("Encryption","",""))
// {
try
{
// Create a RijndaelManaged object
// with the specified key and IV.
aesAlg = new AesCryptoServiceProvider();
aesAlg.Key = key;
aesAlg.IV = GetInitializationVector();
aesAlg.Padding = PaddingMode.PKCS7;
// Create an encryptor to perform the stream transform.
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for encryption.
msEncrypt = new MemoryStream();
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
// Clear the RijndaelManaged object.
if (aesAlg != null)
aesAlg.Clear();
}
// Return the encrypted bytes from the memory stream.
// Console.WriteLine();
return Convert.ToBase64String(msEncrypt.ToArray());
// }
}
private byte[] GetInitializationVector()
{
byte[] iv;
//create the initial salt
byte[] salt = Encoding.Default.GetBytes("abcdefghijkl");
//create the key generator
Rfc2898DeriveBytes keyGenerator = new Rfc2898DeriveBytes("ricksaw", salt);
iv = keyGenerator.GetBytes(16);
return iv;
}
谁能帮我用 Java 创建等效的东西吗?
最佳答案
我已经想出了一个办法。它工作正常
我已请求 .net 对应方将 key 和 IV 作为字符串传递。我将它们编码为 byte[] 并使用下面的代码
String sKey ="fromdotnetpart";
String sIv="fromdotnetiv";
byte[] bKey = skey.getBytes();
byte[] iv = sIv.getBytes();
SecretKeySpec skey = new SecretKeySpec(bKey, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AlgorithmParameterSpec param = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key,param);
String decrypted = cipher.doFinal(encryptedString.getBytes());
希望这对您有帮助。请注意,对于更高强度的 AES 加密,即 AES-256,192 等,您需要下载 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files
关于java - Java 中的 RFC2898DeriveBytes 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9375004/
我是一名优秀的程序员,十分优秀!