[英]Java AES encryption and decryption using a predefined 128bit key
Java中的以下代码尝试解密以QR码编码的字符串,并以C#代码加密。 似乎无法解密该字符串。 有一个简单的方法可以做到这一点吗???
//string encrypted contains the string of the encoded characters.
String encrypted = intent.getStringExtra("SCAN_RESULT");
//converting the string into a byte array
byte[] byteEncrypted = encrypted.getBytes();
//instantiating the AES cipher object
Cipher cipher = Cipher.getInstance("AES");
//Predefined public-key
byte[] skey = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
//creating a secretKeySpec
SecretKeySpec skeyspec = new SecretKeySpec(skey, "AES");
//initializing the cipher to Decrypt
cipher.init(Cipher.DECRYPT_MODE, skeyspec);
final byte[] decrypt = cipher.doFinal(byteEncrypted);
//decrypting the string
String contents = new String(decrypt, "UTF-8");
对于初学者,通常不能将存储为文本的密文转换为文本,而通过调用getBytes()
将其直接转换为字节。
AES密文包含值从0到255的字节。 我知道没有字符集编码可将所有256个值映射到一个字符,即使有一个,也不大可能是您的平台默认编码,并且您没有在文本到字节的转换中指定它。
密文中最常见的字节到文本转换是Base-64编码。 如果这是您在此处使用的内容,则必须查找或编写base-64解码实用程序。
创建Cipher
实例时,还应该指定完整的转换。 否则,将使用提供商特定的默认值,并且该默认值可能与发送者的选择不匹配。
由于您没有显示任何IV,因此您可能正在使用ECB作为模式。 对于大多数邮件,这是不安全的。 仅当您的消息是一个较大的随机数(例如会话标识符)时,它才是安全的。
填充很可能是PKCS#5填充(在.NET中称为PKCS7Padding),但是您可能没有填充或某些自制的填充算法。
假设ECB和PKCS#5填充,您的密码创建应如下所示:
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.