AES加密的问题(加密字符串不是应该有的 您所在的位置:网站首页 netty发送字符串 AES加密的问题(加密字符串不是应该有的

AES加密的问题(加密字符串不是应该有的

2023-04-13 07:58| 来源: 网络整理| 查看: 265

我试图加密一个纯文本字符串,以便使用AES加密与第三方系统集成。接收方没有任何文档来解释他们的加密算法是什么,他们只是简单地共享了下面的Java代码来解释加密的工作原理:

import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; public class CipherData { private static final String SALT = "pa(MS"; //Salt. Required for key generation private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; //Encryption Algorithm/Cipher/Padding private static String SECRET_KEY_FACTORY_ALGORITHM = "PBKDF2WithHmacSHA1"; private static int KEY_SIZE = 256; private static final String TOKEN = "Pre123454sk"; //Password. Used for Key Generation private static String initVector = "pre1234Init12345"; //IV. Required for Key generation private static int KEY_ITERATIONS = 22123; public static String encrypt(String value) throws Exception { //Encryption Module Cipher cipher = Cipher.getInstance(ALGORITHM); IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); Key key = generateKey(); cipher.init(1, key, iv); byte[] encrypted = cipher.doFinal(value.getBytes()); return base64Encode(encrypted); } public static String decrypt(String value) throws Exception { //Decryption module IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); Key key = generateKey(); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(2, key, iv); byte[] original = cipher.doFinal(base64Decode(value)); return new String(original); } private static Key generateKey() throws Exception { //AES Key Generation byte[] saltBytes = SALT.getBytes("UTF-8"); SecretKeyFactory skf = SecretKeyFactory.getInstance(SECRET_KEY_FACTORY_ALGORITHM); PBEKeySpec spec = new PBEKeySpec(TOKEN.toCharArray(), saltBytes, KEY_ITERATIONS, KEY_SIZE); SecretKey secretKey = skf.generateSecret(spec); SecretKeySpec key = new SecretKeySpec(secretKey.getEncoded(), "AES"); return key; } private static String base64Encode(byte[] token) { String encoded = DatatypeConverter.printBase64Binary(token); return encoded; } private static byte[] base64Decode(String token) { return DatatypeConverter.parseBase64Binary(token); } public static void main(String[] args) { String clearPAN="ABCDE1234F", encrPAN="", decrPAN=""; try { encrPAN=encrypt(clearPAN); decrPAN=decrypt(encrPAN); System.out.println("Clear PAN: " + clearPAN); System.out.println("Encrypted PAN: " + encrPAN); System.out.println("Decrypted PAN: " + decrPAN); } catch (Exception e) { System.out.print("Exception Occured in main()"); e.printStackTrace(); } } }

我正在用.NET开发我的应用程序,我无法获得与接收方通过使用上面的Java代码获得的相同的字符串,而且我们对于应该做什么没有什么想法。

下面是我的.NET算法(我刚刚从Java代码中推断出这个逻辑,这是我第一次使用Java,所以如果我犯了一个愚蠢的错误,请见谅):

private static String TOKEN = "Pre123454sk"; private static String initVector = "pre1234Init12345"; private static string Encryption(string plainText) { using (var aesProvider = new AesCryptoServiceProvider()) { //String SALT = "pa(MS"; PasswordDeriveBytes pdb = new PasswordDeriveBytes(TOKEN, Encoding.UTF8.GetBytes("pa(MS")); pdb.IterationCount = 22123; aesProvider.KeySize = 256; aesProvider.Padding = PaddingMode.PKCS7; aesProvider.Mode = CipherMode.CBC; aesProvider.Key = pdb.GetBytes(16); aesProvider.IV = Encoding.UTF8.GetBytes(initVector); Byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); ICryptoTransform encryptor = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV); using (var memStream = new MemoryStream()) { using (var cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write)) { cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); cryptoStream.FlushFinalBlock(); Byte[] cipherTextBytes = memStream.ToArray(); memStream.Close(); memStream.Flush(); cryptoStream.Close(); return Convert.ToBase64String(cipherTextBytes); } } } } private static string Decryption(string plainText) { using (var aesProvider = new AesCryptoServiceProvider()) { PasswordDeriveBytes pdb = new PasswordDeriveBytes(TOKEN, Encoding.UTF8.GetBytes("pa(MS")); pdb.IterationCount = 22123; aesProvider.KeySize = 256; aesProvider.Padding = PaddingMode.Zeros; aesProvider.Mode = CipherMode.CBC; aesProvider.Key = pdb.GetBytes(16); aesProvider.IV = Encoding.UTF8.GetBytes(initVector); byte[] cipherTextBytes1 = Convert.FromBase64String(plainText); ICryptoTransform decryptor = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV); using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes1)) { using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read)) { using (StreamReader streamReader = new StreamReader((Stream)cryptoStream)) { return streamReader.ReadToEnd(); } } } } }

我已经尝试用PasswordDeriveBytes()函数中的IV值替换令牌值,但是它仍然给了我相同的错误(接收系统无法解密这个请求)。

这里是我试图加密的纯文本:CXQPM4656P

Here是我从.NET代码中得到的: pKjfaKu4AxBEbagiAWoLkg==

Here是我应该得到的: kY8lgWh97fqkm9gS8zgMHg==

我在这一点上没有想法,我没有来自另一端的支持。如果有人能帮我弄清楚那就太好了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有