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