我只想确认我对AES如何工作的理解.
如果公司#1正在加密数据,并将此数据发送到公司#2进行解密,那么假设其中一个使用C#和另一个Java.
只要两者都使用相同的共享密钥,是否还有其他任何设置/配置双方都应该同意确保数据正确加密和解密?
解决方法:
有很多都必须达成一致:
>共享密钥
>多久了? (需要密钥填充吗?)
>实际密钥是从另一个密钥或密码派生而来的吗?
>使用哪个密钥派生函数以及它们的参数是什么? PBKDF2,bcrypt,scrypt,……
> IV是否与密钥一起派生? (通常通过从密钥派生函数请求密钥大小IV大小输出)
>密码特征:
>分组密码,如AES,Triple DES,Twofish,Rijndael,……
>密码参数,例如块大小,以防它是可变的
> CBC,CTR,CFB等运作模式……
>对于基于IV的模式:如何生成IV?它是随机生成并放入容器格式还是与密码中的密钥一起派生,因此不需要放入密文容器中?
>对于基于随机数的模式,如CTR:nonce有多大(有时称为IV)?
>对于像CFB这样的参数化模式:一个段有多大?
>填充模式,如PKCS#7填充(也称为PKCS#5填充),ZeroPadding,…
>身份验证(如果有):
>作为操作模式,如GCM,EAX,SIV,……
>作为单独的加密 – 然后 – MAC / MAC-然后 – 加密/加密 – 和MAC方案与MAC,如HMAC-SHA256,CMAC,HKDF,GHASH,……
>每个组件的编码,如Hex,Base32,Base64或简单二进制(无编码)
>所有内容是否都是从完成的二进制格式编码为文本格式,还是单独编码并连接在一起的组件?
>格式:
>在哪里放IV / nonce / salt(如果有的话)? (通常在实际密文之前)
>在哪里放置认证标签(如果有的话)? (通常在实际的密文之后)
> Cryptographic Message Syntax适用吗?