我正在尝试重新创建现有的移动应用程序,但是却在Android上的“ PBEWithMD5AndDES”加密中苦苦挣扎,我似乎在dart中找不到类似的方法。
到目前为止,这是我尝试使用Flutter_Des.dart,Password_Hash.dart和Crypto.dart库实现的功能,但仍然无法获得相同的输出。
encryptPassword(String keyStr, String passwordStr) async {
if (keyStr.length == 0 || passwordStr.length == 0) {
return "";
}
var generator = new PBKDF2(hashAlgorithm: md5);
String saltStr = generateSaltBase64String();
var hash = generator.generateBase64Key(keyStr, saltStr, round, keyLength);
var encryptBase64 = await FlutterDes.encryptToBase64(passwordStr, hash.toString());
return encryptBase64;
}
以下是我目前在Android上所拥有的。
KeySpec keySpec = new PBEKeySpec(str.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
ecipher = Cipher.getInstance("PBEWithMD5AndDES");
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
byte[] utf8 = password.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
enc = Base64.encode(enc, Base64.DEFAULT);
return new String(enc);
我期望与android相同的输出,以便我的后端能够解密它。
答案 0 :(得分:1)
PBEWithMD5AndDES使用PBKDF1生成密钥材料(不是PBKDF2)。这样可以提供128位密钥材料,然后将其用作两个64位半部分作为密钥和DES的IV。
按如下所示派生密钥和IV-我为迭代,密码和盐插入了一些任意值,并针对JCrypto进行了确认。
int iterations = 31;
List<int> salt = [0x21, 0x21, 0xf0, 0x55, 0xc3, 0x9f, 0x5a, 0x75];
List<int> password = utf8.encode('test');
List<int> saltedKey = password + salt;
Digest d = md5.convert(saltedKey);
for (int i = 1; i < iterations; i++) {
d = md5.convert(d.bytes);
}
print(d);
List<int> key = d.bytes.sublist(0, 8);
List<int> iv = d.bytes.sublist(8, 16);
print(key);
print(iv);
我找不到使用密钥和IV作为字节的DES的Dart实现。 triple_des
希望它们作为字符串-即已被愚弄。尖尖的城堡不做DES。 FlutterDes也似乎想要字符串。您可能可以修改triple_des
以使用二进制密钥和IV。或使用其他密码。
答案 1 :(得分:0)
通过使用flutter的methodchannel并调用平台特定的代码来进行加密及其工作已解决。谢谢