我需要使用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);
}
感谢您提前提供的任何提示!
您没有在解密方法中对密文进行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,这就是我所拥有的,但是它不起作用(它给我的加密字符串