当前位置: 首页 > 知识库问答 >
问题:

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

白越
2023-03-14

我需要使用C语言实现一个html" target="_blank">加密和解密方法对,该语言使用“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#重建它的尝试:

public static string Encrypt_AES(string plainText, byte[] key2)
{
    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 plainTextBytes = Encoding.UTF8.GetBytes(plainText);
    var encryptor = aes.CreateEncryptor();
    byte[] encryptedTextBytes = encryptor.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length);
    return Convert.ToBase64String(encryptedTextBytes);
}

在加密某些内容并将其发送到远程服务后,该服务回复错误说它无法解密消息。所以我假设它有问题。

我在Java也有一个解密方法的例子。我也实现了那个方法,并试图在本地加密和解密一些文本。当我这样做的时候,Decrypt_AES方法在TransformFinalBlock()上抛出一个Cryptograph icException,说“填充无效,无法删除。”也许我使用了错误的密码提供者类?

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

public static String Decrypt(String encryptedText, byte[] key2) throws NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    byte[] decryptedTextBytes=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.DECRYPT_MODE, keySpec);
    byte[] encryptedTextBytes = new Base64().decode(encryptedText);
    decryptedTextBytes = cipher.doFinal(encryptedTextBytes);
    return new String(decryptedTextBytes);
}

C#

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);
}

感谢您提前提供的任何提示!

共有1个答案

沈淇
2023-03-14

您没有在解密方法中对密文进行Base64解码。

var encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);

应该更改为类似

var encryptedBytes = Convert.FromBase64String(encryptedText);
 类似资料:
  • 在对python相当了解的基础上,我正在努力学习如何在Java中编码。 为了学习,我正在“翻译”一个旧的Python类“银行账户”,从python到Java。到目前为止,这一切都很顺利,但是我在打印bank帐户对象信息的方法上遇到了麻烦。 我试图将python转换为java的打印输出方法是: 这是我用Java写的: 我收到的错误消息是: 我知道如何通过键入: …但我想更流利地使用字符串。forma

  • 问题内容: 我一直在尝试将用于在Java中加密的代码转换为ruby,但是我无法完全做到这一点。我得到了不同的价值观。 谁能让我知道,如何在红宝石中做到这一点。 问题答案: 加密代码: 解密代码: hex_to_bin和bin_to_hex 在我的情况下,Java代码使用默认的初始化向量,因此我没有设置任何iv,此外,那里缺少一块。因此,此后,所有程序都开始正常工作。 希望有人遇到此问题对您有所帮助

  • 我正在努力学习如何在相当熟悉python的基础上用Java编写代码。 为了学习,我正在将一个旧的python类“bankAccount”从python“翻译”为Java。到目前为止,这一切都很顺利,但我在打印bankAccount对象信息的方法上遇到了问题。 我试图从python到java的打印输出方法是: 这是我在Java写的: 我得到的错误消息是: 我知道如何通过键入: …但我想更流利地使用字

  • 我有作为字符串的公钥和私钥,它们是由Webcrypto API RSA-OAEP算法生成的。我想加密和解密一些纯文本,使用这些和获得异常时,试图转换字符串到字节数组 Java代码: 例外情况: 线程“main”Java.lang.IllegalArgumentException中出现异常:Java.util.base64$Decoder.Decode0(base64.:714)Java.util.

  • 问题内容: 好的,所以我试图用“,”分割字符串,它们不在’[‘或’]’内部。我有一个适用于JavaScript的RegEx,但无法将其转换为Java语法。 JS RegEX: 例句: 它在http://refiddle.com上运行良好,但是当我尝试在Java中(在Eclipse下)使用RegEx时,出现错误消息: 索引10附近的未封闭字符类,(?![^ [] *]) 我所做的就是删除开头的“ /

  • 我正在尝试转换用ActionScript编写的加密/解密程序,并找到它的PHP等价物。编写动作脚本代码的开发人员告诉我,他使用了“TEA”算法来做这件事,但我不再与他联系。当我搜索等效的TEA算法并运行它时,不幸的是,我得到的结果与ActionScript的结果不同。有人能帮我吗?提前感谢。 我在这里粘贴了动作脚本代码。 我开始将其转换为PHP,这就是我所拥有的,但是它不起作用(它给我的加密字符串