使用 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是否适用?