适用于Android API 16至18的GCMParameterSpec或类似规范

适用于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

我想创建一个函数来解密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 = 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字节,则似乎有点太多。