我遇到了一个问题 - 现有程序使用下面的代码来加密数据
"git clone https://", { "Ref": "GitLabUsn" },":", { "Ref": "GitLabPwd" },"@gitlab.com/user/repository.git \n"
我需要在Node.Js上编写解密此加密数据的代码。到目前为止 - 我已经提出了
public static String encryptData(String data, final String key) {
try {
byte[] kb=key.getBytes("utf-8");
byte[] dig= MessageDigest.getInstance("SHA-1").digest(kb);
byte[] kdig= Arrays.copyOf(dig, 24);
final SecretKeySpec secretKeySpec = new SecretKeySpec(kdig, "DESede");
final Cipher instance = Cipher.getInstance("DESede");
instance.init(ENCRYPT_MODE, secretKeySpec);
byte[] ecb=instance.doFinal(data.getBytes("utf-8"));
byte[] enb64=Base64.encode(ecb, Base64.DEFAULT);
return new String(enb64);
} catch (Exception ex) {
ErmsLogger.e(TAG, ex.getMessage());
return null;
}
}
我继续遇到
function decryptData(encrpted_data,fn){
var hashedKey = crypto.createHash('sha1').update(config.dataPassword).digest('hex');
if(hashedKey.length < 48){
var num=48 - hashedKey.length;
for(var i=0;i < num; i++){
hashedKey +='0';
}
}
var key=Buffer.from(hashedKey, 'hex');
var decipher = crypto.createDecipher('des-ede', key);
decoded = decipher.update(encrpted_data, 'base64', 'utf8');
decoded += decipher.final('utf8');
log.debug(JSON.stringify(decoded));
return fn(decoded);
}
每当我尝试解密从Android应用程序发送的数据时。 Android(Java)上的工作解密代码是
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Decipher.final (internal/crypto/cipher.js:104:26)
你能协助我在Node中翻译吗?
答案 0 :(得分:0)
经过一番研究并对抗它之后 - 我终于想出了一些有用的东西
function decryptData(encrpted_data,fn){
var encodeKey = crypto.createHash('sha1').update(config.dataPassword).digest('hex');
var cryptkey=Buffer.alloc(24);
encodeKey.copy(cryptkey);
var decipher = crypto.createDecipheriv('des-ede3', cryptkey,'');
decipher.setAutoPadding(true);
decoded = decipher.update(encrpted_data, 'base64', 'utf8');
decoded += decipher.final('utf8');
log.debug(JSON.stringify(decoded));
return fn(decoded);
}
解释 - crypto.createDecipher() - 内部使用MD5哈希作为传递给它的密钥,因此发送的密钥值实际上并不重要 - 它将被更改。所以最好的选择是使用接受原始密钥的createDecipheriv。这允许你在传入之前将你的密钥哈希在外面。由于我没有使用任何IV - 我传递了&#39;&#39;的值。 在Java(Android)中,DESede实际上是TripleDES,而在crypto上的等价物是&#39; des-ede3&#39;而不是&#39; des-ede&#39;。 我希望这能节省几个小时。