繁体   English   中英

使用预定义的128位密钥进行Java AES加密和解密

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM