Шифрование C# показывает результат, отличающийся от эквивалента JavaC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Шифрование C# показывает результат, отличающийся от эквивалента Java

Сообщение Anonymous »

У меня есть фрагмент кода Java, который мне нужно преобразовать в C#. Исходный код Java выглядит следующим образом

Код: Выделить всё

    public static String encryptPassword(String pwd, String key) {
try {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key secretKey = getDesSecretKey(key);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] data = pwd.getBytes(StandardCharsets.UTF_8);
byte[] result = cipher.doFinal(data);
return new sun.misc.BASE64Encoder().encode(result);
} catch (Exception e) {
return null;
}
}

public static SecretKey getDesSecretKey(String key) {
byte[] result = new byte[8];
byte[] keys;
keys = key.getBytes(StandardCharsets.UTF_8);
for (int i = 0; i < 8; i++) {
if (i < keys.length) {
result[i] = keys[i];
} else {
result[i] = 0x01;
}
}
return new SecretKeySpec(result, "DES");
}
Я преобразовал его в код C# ниже

Код: Выделить всё

    public static string EncryptPassword(string password, string key)
{
const int keyLength = 8;
var bytes = new byte[keyLength];
var keyBytes = Encoding.UTF8.GetBytes(key);
for (int i = 0; i < keyLength; i++)
{
if (i < keyBytes.Length)
bytes[i] = keyBytes[i];
else
bytes[i] = 0x01;
}

#pragma warning disable S5547
using var des = DES.Create();
#pragma warning restore S5547
des.Key = bytes;
des.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
#pragma warning disable S3329
var encryptor = des.CreateEncryptor(des.Key, des.IV);
#pragma warning restore S3329
var passwordBytes = Encoding.UTF8.GetBytes(password);
var payload = encryptor.TransformFinalBlock(passwordBytes, 0, passwordBytes.Length);

return Convert.ToBase64String(payload);
}
В простых случаях это работало нормально. Например, пароль 000000 и ключ 18823214892 и т. д. Код Java и C# дают одинаковый результат. Но в немного сложных случаях, таких как пароль crmeb.com и демонстрационный ключ, результат отличается на 10-м символе. Java выдает 7iIl3H5zCinwrYbrxAR7cQ==, но C# показывает 7iIl3H5zCikSuWVlZa1dyA==. Что я сделал не так? Может быть, des.IV следует инициализировать по-другому? Или я выбрал неправильный класс шифрования?
Ниже приведен мой тестовый код

Код: Выделить всё

var encryptedPassword = CryptoUtils.EncryptPassword("000000", "18823214892");
encryptedPassword.Should().Be("PwePP4OrK2o=");

encryptedPassword = CryptoUtils.EncryptPassword("123456", "admin");
encryptedPassword.Should().Be("L8qdg72wbeQ=");

encryptedPassword = CryptoUtils.EncryptPassword("000000", "18292417675");
encryptedPassword.Should().Be("w9LTrURn7xU=");

encryptedPassword = CryptoUtils.EncryptPassword("crmeb.com", "demo");
encryptedPassword.Should().Be("7iIl3H5zCinwrYbrxAR7cQ==");
Последний тестовый пример не пройдет
Кстати, я перешел по этой ссылке, чтобы выполнить преобразование. Эквивалентный код шифрования Java в .NET

Подробнее здесь: https://stackoverflow.com/questions/790 ... equivalent
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Шифрование C# показывает результат, отличающийся от эквивалента Java
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • SOFR меняет NPV и денежный поток, отличающийся от результатов BBG, с использованием Python Quantlib
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Как обернуть простой буфер символов с помощью std::string или его эквивалента?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Плавать внутри flexbox (или эквивалента)
    Anonymous » » в форуме CSS
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Плавать внутри flexbox (или эквивалента) [закрыто]
    Anonymous » » в форуме CSS
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»