使用C#进行AES加密和使用Java进行解密

我只想确认我对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,…
  • 身份validation(如果有):
    • 作为GCM,EAX,SIV等操作模式……
    • 作为单独的加密 – 然后 – MAC / MAC-然后 – 加密/加密 – 和MAC方案与MAC,如HMAC-SHA256,CMAC,HKDF,GHASH,……
  • 每个组件的编码,如Hex,Base32,Base64或简单二进制(无编码)
    • 一切都是从完成的二进制格式编码为文本格式,还是单独编码并连接在一起的组件?
  • 格式:
    • 在哪里放IV / nonce / salt(如果有的话)? (通常在实际密文之前)
    • 在哪里放置认证标签(如果有的话)? (通常在实际的密文之后)
    • 加密消息语法是否适用?