Anonymous
Метод шифрования, перенесенный с C# на Java
Сообщение
Anonymous » 14 янв 2025, 13:17
Это метод шифрования C#, я хочу использовать его в Java.
MyCode всегда показывает: «Учитывая, что последний блок не заполнен должным образом. Такие проблемы могут возникнуть, если во время расшифровки используется неверный ключ».
Можете ли вы помочь перенести этот код C# на Java?
используйте C#
Код: Выделить всё
EncryptData = bL6ZXAUGsE9+Ea9BVgrYYDJrzmtzjooHbHqc1K/YMGE=
rawData = abcd1234
Код: Выделить всё
java code
public static String Decrypt(String cipherText) {
byte[] cipherBytes = Base64.getDecoder().decode(cipherText);
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(Password.toCharArray(), SALE, 100, 48 * 8);
byte[] keyBytes = factory.generateSecret(spec).getEncoded();
byte[] key = new byte[32];
byte[] iv = new byte[16];
System.arraycopy(keyBytes, 0, key, 0, 32);
System.arraycopy(keyBytes, 32, iv, 0, 16);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(cipherBytes);
return new String(decryptedBytes, StandardCharsets.UTF_16LE);
} catch (Exception e) {
return e.getMessage();
}
}
Код: Выделить всё
c# code
public static string Decrypt(string cipherText)
{
string Password = "abcde~1234";
byte[] cipherBytes = Convert.FromBase64String(cipherText);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] {0x49, 0x20, 0x4d, 0x65,
0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
MemoryStream ms = new MemoryStream();
Aes alg = Aes.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
CryptoStream cs = new CryptoStream(ms,
alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
byte[] decryptedData = ms.ToArray();
return Encoding.Unicode.GetString(decryptedData);
}
c# code
public static string Encrypt(string clearData)
{
string Password = "abcde~1234";
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] {0x49, 0x20, 0x4d, 0x65,
0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
Aes alg = Aes.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,
alg.CreateEncryptor(), CryptoStreamMode.Write);
byte[] clearDataBytes = Encoding.Unicode.GetBytes(clearData);
cs.Write(clearDataBytes, 0, clearDataBytes.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return Convert.ToBase64String(encryptedData);
}
большое спасибо.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... rp-to-java
1736849878
Anonymous
Это метод шифрования C#, я хочу использовать его в Java. MyCode всегда показывает: «Учитывая, что последний блок не заполнен должным образом. Такие проблемы могут возникнуть, если во время расшифровки используется неверный ключ». Можете ли вы помочь перенести этот код C# на Java? используйте C# [code]EncryptData = bL6ZXAUGsE9+Ea9BVgrYYDJrzmtzjooHbHqc1K/YMGE= rawData = abcd1234 [/code] [code]java code public static String Decrypt(String cipherText) { byte[] cipherBytes = Base64.getDecoder().decode(cipherText); try { SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); KeySpec spec = new PBEKeySpec(Password.toCharArray(), SALE, 100, 48 * 8); byte[] keyBytes = factory.generateSecret(spec).getEncoded(); byte[] key = new byte[32]; byte[] iv = new byte[16]; System.arraycopy(keyBytes, 0, key, 0, 32); System.arraycopy(keyBytes, 32, iv, 0, 16); SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] decryptedBytes = cipher.doFinal(cipherBytes); return new String(decryptedBytes, StandardCharsets.UTF_16LE); } catch (Exception e) { return e.getMessage(); } } [/code] [code]c# code public static string Decrypt(string cipherText) { string Password = "abcde~1234"; byte[] cipherBytes = Convert.FromBase64String(cipherText); PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] {0x49, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); MemoryStream ms = new MemoryStream(); Aes alg = Aes.Create(); alg.Key = pdb.GetBytes(32); alg.IV = pdb.GetBytes(16); CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(cipherBytes, 0, cipherBytes.Length); cs.Close(); byte[] decryptedData = ms.ToArray(); return Encoding.Unicode.GetString(decryptedData); } c# code public static string Encrypt(string clearData) { string Password = "abcde~1234"; PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] {0x49, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76}); Aes alg = Aes.Create(); alg.Key = pdb.GetBytes(32); alg.IV = pdb.GetBytes(16); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write); byte[] clearDataBytes = Encoding.Unicode.GetBytes(clearData); cs.Write(clearDataBytes, 0, clearDataBytes.Length); cs.Close(); byte[] encryptedData = ms.ToArray(); return Convert.ToBase64String(encryptedData); } [/code] большое спасибо. Подробнее здесь: [url]https://stackoverflow.com/questions/79354486/an-encryption-method-ported-from-c-sharp-to-java[/url]