AES加密用c#实现,解密用Java实现

本文关键字:实现 Java 解密 加密 AES | 更新日期: 2023-09-27 18:05:43

我只是想确认一下我对AES如何工作的理解。

如果公司#1正在加密数据,并将该数据发送给公司#2解密,我们假设其中一个使用c#,另一个使用Java。

只要双方都使用相同的共享密钥,是否有任何其他设置/配置双方应该同意,以确保数据正确加密和解密?

AES加密用c#实现,解密用Java实现

有很多事情双方必须达成一致:

  • 共享密钥
    • 有多长?(是否需要键填充?)
    • 实际的密钥是从另一个密钥或密码派生的吗?
      • 使用了哪些密钥派生函数,它们的参数是什么?PBKDF2, bcrypt, script,…
      • 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方案,使用HMAC-SHA256, CMAC, HKDF, GHASH,…
  • 编码的每个组件,如十六进制,Base32, Base64或简单的二进制(不编码)
    • 是将所有内容从完成的二进制格式一起编码为文本格式,还是将组件单独编码并连接在一起?
  • 格式:
    • IV/nonce/salt(如果有)放在哪里?(通常在实际密文之前)
    • 在哪里放置认证标签(如果有的话)?(通常在实际密文之后)
    • 是否适用加密消息语法?