Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将加密方法从Java转换为C#_Java_C#_Encryption_Aes - Fatal编程技术网

将加密方法从Java转换为C#

将加密方法从Java转换为C#,java,c#,encryption,aes,Java,C#,Encryption,Aes,我需要使用C#实现一个加密和解密方法对,它使用“AES/ECB/PKCS5Padding”。原始代码是用Java编写的。以下是Java中的加密方法: public static String Encrypt(String plainText, byte[] key2) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPadding

我需要使用C#实现一个加密和解密方法对,它使用“AES/ECB/PKCS5Padding”。原始代码是用Java编写的。以下是Java中的加密方法:

public static String Encrypt(String plainText, byte[] key2) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
      byte[] encryptedTextBytes=null;
      byte[] key3 =null;
      MessageDigest sha = MessageDigest.getInstance("SHA-1");
      key3= sha.digest(key2);
      key3 = copyOf(key3, 16);
      SecretKeySpec keySpec = new SecretKeySpec(key3, "AES");
      // Instantiate the cipher
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, keySpec);
      encryptedTextBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
      return new Base64().encode(encryptedTextBytes);
}
这是我用C#重建它的尝试:

在对某些内容进行加密并将其发送到远程服务后,该服务返回一个错误,表示无法解密该消息。所以我假设它有问题

我还有一个Java解密方法的例子。我也实现了这个方法,并尝试在本地加密和解密一些文本。当我这样做时,Decrypt_AES方法在TransformFinalBlock()上抛出一个
加密异常
,表示“填充无效,无法删除”。也许我使用的加密提供程序类是错误的

以下是解密函数的Java和C版本: 爪哇

C#


感谢您提前给予的任何提示

在解密方法中对密文进行解码不是Base64

var encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
应该改成

var encryptedBytes = Convert.FromBase64String(encryptedText);

你需要说明出了什么问题。也就是说,你期望什么,你观察到了什么?否则,该问题与StackOverflow无关。这将使解密方法正常工作,谢谢。但加密方法仍然存在一些问题。你知道java和C#encrypt方法有什么不同吗?我现在用相同的输入运行java代码和C#代码。它产生完全相同的输出。看来我的方法毕竟是正确的。我将联系我正在尝试呼叫的服务的开发人员。如果没有其他问题,我会接受这个答案,因为它解决了唯一的问题。再次感谢@JamesKPolk
public static string Decrypt_AES(byte[] key2, string encryptedText)
{
    var sha = new System.Security.Cryptography.SHA1CryptoServiceProvider();
    byte[] key3 = new byte[16];
    sha.TransformFinalBlock(key2, 0, key2.Length);
    var tmpkey = sha.Hash;
    Array.Copy(tmpkey, key3, 16);

    var aes = new System.Security.Cryptography.AesCryptoServiceProvider();
    aes.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
    aes.Mode = System.Security.Cryptography.CipherMode.ECB;
    aes.Key = key3;

    var encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
    var decryptor = aes.CreateDecryptor();
    var decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);            

    return System.Text.Encoding.UTF8.GetString(decryptedBytes);
}
var encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
var encryptedBytes = Convert.FromBase64String(encryptedText);