适用于Android API 16至18的GCMParameterSpec或类似规范
我想创建一个函数来解密nodejs加密的aes-256-gcm消息适用于Android API 16至18的GCMParameterSpec或类似规范,android,node.js,encryption,node-crypto,Android,Node.js,Encryption,Node Crypto,我想创建一个函数来解密nodejs加密的aes-256-gcm消息 async decrypt_pw(password, key) { const key = 'secret'; const pwBuffer = Buffer.from(password, 'hex'); const authTag = pwBuffer.slice(-16); const iv = pwBuffer.slice(0, 12); const encryptedMessage
async decrypt_pw(password, key) {
const key = 'secret';
const pwBuffer = Buffer.from(password, 'hex');
const authTag = pwBuffer.slice(-16);
const iv = pwBuffer.slice(0, 12);
const encryptedMessage = pwBuffer.slice(12, -16);
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv, { authTagLength: 16 });
decipher.setAuthTag(authTag);
let messagetext = decipher.update(encryptedMessage);
messagetext = Buffer.concat([messagetext, decipher.final()]).toString();
return messagetext;
}
参考在线解决方案后,需要GCMParameterSpec,即API 19及以上版本
GCMParameterSpec gcmSpec = new GCMParameterSpec(tagSize, new byte[gcm.getBlockSize()]);
如何访问API 16上的GCMPareter或aes-256-gcm解密的任何替代方案?让我们看看您的初始化:
const iv = pwBuffer.slice(0, 12);
...
const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv, { authTagLength: 16 });
和GCMParameterSpec
的参数:
GCMParameterSpec(int tLen, byte[] src)
这里的tLen
是以位为单位的标记长度,因此它是authTagLength*8
,它需要有128位的值
名称不正确的src
参数用于IV,因此与IV
参数相同,即代码中的12个字节
幸运的是,96位IV(或者更确切地说是nonce)和128位身份验证标记都是GCM的默认值。所以基本上你可以使用:
new IvParameterSpec(iv)
在你的Android代码中。这是标准做法,直到可以使用GCMParameterSpec
添加身份验证标签大小配置选项
对于其他读者:如果IV是而不是12字节,则首先必须检查GCM实现是否支持大小不同的IV值
如果身份验证标记较短(它应该以8位增量在32位和128位之间变化,96-128是相对安全的),那么Java的验证将失败——似乎没有办法在密文之外检索计算出的身份验证标记。因此,在这种情况下,您必须跳转到循环并获得一个不同的实现,它不使用
密码
将AES与HmacSHA512一起使用?它从API 1开始提供。很抱歉,请问如何使用AES和HmacSHA512设置身份验证标记?您需要使用类似HKDF的KDF从密钥中派生两个密钥,然后使用HMACSHA612的第二个密钥(密钥2,消息)。HMAC像任何MAC一样为您提供数据完整性和消息真实性。GCM是一种提供机密性、完整性和身份验证的操作模式。机密性来自AES。我尝试使用IvParameterSpec,但它说它只允许长度16。GCM使用长度12。我是说,如果你想在API 18到10中使用android.cipher,就不要使用AES-GCM。将AES与HMACSHA512一起使用。如果您坚持使用外部库行BouncyCastleSure,那么就要让提供程序的GCM特定的CipherSpi
实现接受它,这就是诀窍。当然,对于Android,我认为您不必签署您的提供商,所以复制一个GCM实现并将其置于其他GCM实现的较高优先级(较低的索引)也会起作用。不过,如果您的身份验证标记是推荐的16字节,则似乎有点太多。