/ / Encyrpting string za pomocą Triple DES w języku c #? - java, c #, encryption, des, ecb

Encyrpting ciąg za pomocą Triple DES w języku c #? - java, c #, encryption, des, ecb

Próbuję napisać program c #, który będzieszyfrowanie ciągu za pomocą klucza API. Klucz API jest generowany przez bramkę płatności innej firmy. Dokumentacja jest dostarczana w języku java i udało mi się zaszyfrować ciąg znaków w java, ale próbowałem zaszyfrować łańcuch za pomocą kodu c # i wygenerował on inny wynik. Właśnie to próbowałem do tej pory. java -

 public static String harden(String unencryptedString) throws NoSuchAlgorithmException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
String key ="***************";
MessageDigest md = MessageDigest.getInstance("md5");
byte[] digestOfPassword = md.digest(key.getBytes("utf-8"));
byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);

for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}

SecretKey secretKey = new SecretKeySpec(keyBytes, "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);

byte[] plainTextBytes = unencryptedString.getBytes("utf-8");
byte[] buf = cipher.doFinal(plainTextBytes);
byte[] base64Bytes;

base64Bytes = Base64.getEncoder().encode(buf);

String base64EncryptedString = new String(base64Bytes);

return base64EncryptedString;
}

kod c # -

public TripleDES CreateDES(string key)
{
MD5 md5 = new MD5CryptoServiceProvider();
TripleDES des = new TripleDESCryptoServiceProvider();
des.Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
des.IV = new byte[des.BlockSize / 8];
return des;
}

public  byte[] Encryption(string PlainText, string key)
{
TripleDES des = CreateDES(key);
ICryptoTransform ct = des.CreateEncryptor();
byte[] input = Encoding.Unicode.GetBytes(PlainText);
return ct.TransformFinalBlock(input, 0, input.Length);
}

Odpowiedzi:

0 dla odpowiedzi № 1

Oprócz uwagi Jon, the TripleDESCryptoServiceProvider domyślnie szyfrowanie / odszyfrowywanie w trybie CBC. Musisz określić tryb ECB dla C #, zauważając, że tryb ECB jest niepewny.


Właściwie, aby zapewnić pełne bezpieczeństwo, szyfrogram powinien zawsze są różne dla każdego szyfrowania / deszyfrowania za pomocą tego samego klucza. To właśnie jest (losowa) IV w trybie CBC.


Obecnie staramy się używać uwierzytelnionego szyfru, takiego jak AES / GCM, najlepiej w ramach bezpiecznego protokołu. Na przykład taki, który używa metody pozyskiwania klucza bezpiecznego, która nie jest MD5.