AES加密和解密的值不同

时间:2019-10-25 13:45:19

标签: java android encryption aes hmacsha1

在一个Android应用中,我正在尝试使用JSON中具有加密值的WebAPI。我有一个处理加密的C#脚本,并且已将其改编为Android。简而言之,加密方法是在字节数组中添加一些变量,随机生成的IV,随机生成的盐和hmacsalt,添加使用AES / CBC / Pkcs7Padding从Json字符串生成的密文并生成hmac并将其添加到字节中数组。将此字节数组转换为base64,可以得到加密的字符串。我认为在此过程中一切正常,因为WebAPI能够解密我的字符串。问题出在,该字符串被解密的过程大部分是正确的,但是有一个日期字段,并且日期似乎是完全错误的。

我一直在尝试使C#适应Android,但我不确定如何指定密钥长度。 C#和Android中的密钥生成器如下。

var pbkdf2 = new Rfc2898DeriveBytes(password, salt, pbkdf2_iterations).GetBytes(pbkdf2_keyLength);

这里pbkdf2_iterations = 100并且pbkdf2_keyLength = 32;

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, 100, 32);
byte[] key = factory.generateSecret(pbeKeySpec).getEncoded();

在这里,当启动PBEKeySpec时,当我为密钥长度传递32时,byte [] key变成4个字节,并且有一个例外,说不支持的密钥大小为4个字节,但是WebAPI能够解密带有日期错误的字符串。当我通过256作为密钥长度时,为了使byte []为32个字节,WebAPI无法解密该字符串。

我对执行此操作的正确方法感到困惑。

举一个关于错误的解密字符串的例子,我要加密的明文是;

{"Username":"username","Password":"password","DateCreated":"2019-10-25T14:46:01.441Z"} 

但是解密后的字符串是

{"Username":"username","Password":"password","DateCreated":"2019-03-04T09:29:54.3516562Z"}

在这种情况下,我认为加密是正确的,但是不知道日期值和格式如何更改。

对于可能出什么问题的任何意见将不胜感激。

编辑:

JSonObject创建代码

Json数据是静态创建的。

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        String dateString = formatter.format(new java.util.Date());
JsonObject o = new JsonObject();
        o.addProperty("Username", "username");
        o.addProperty("Password","password");
        o.addProperty("DateCreated", dateString);
        String jsonString = o.toString();

并传递jsonString进行加密。我可以看到它的价值就是我想要的方式。

0 个答案:

没有答案