我正在尝试为Android实现自己的KeePass应用,主要用于学习目的。我从http://blog.sharedmemory.fr/en/2014/04/30/keepass-file-format-explained/
找到了要生成最终的主密钥,首先需要生成转换后的密钥:
创建一个AES密码,将Transform Seed作为其密钥/种子,
使用复合键值(transformed_key = composite_key)
初始化转换后的键值使用此密码对transformed_key进行N次加密(transformed_key = AES(transformed_key),N次),
hash(使用SHA-256)transformed_key(transformed_key = sha256(transformed_key)),
将Master Seed连接到transformed_key(transformed_key = concat(Master Seed,transformed_key)),
hash(使用SHA-256)transformed_key获取最终的主密钥(final_master_key = sha256(transformed_key))。
我有第2步:
Cipher c = Cipher.getInstance("AES/ECB/NoPadding");
Key aesKey = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, aesKey);
for (long i = 0; i < rounds; ++i) {
data = c.doFinal(data);
}
然而,它真的非常慢。我知道必须有一个更快的方法,因为Android上的其他KeePass应用程序在解密数据库时运行速度不是很慢。当我看到Android设备监视器时,它正在反复运行doFinal部分,这是有道理的,但必须有一个更快的方法。