【问题标题】:AES encryption using C# and decryption in Java使用 C# 的 AES 加密和 Java 中的解密
【发布时间】:2015-10-22 10:10:29
【问题描述】:

我只是想确认我对 AES 工作原理的理解。

如果 company#1 正在加密数据,并将此数据发送给 company#2 进行解密,假设其中一个使用 C#,另一个使用 Java。

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

【问题讨论】:

    标签: java c# encryption aes compatibility


    【解决方案1】:

    双方都必须达成一致意见:

    • 共享密钥
      • 多久了? (需要键盘填充吗?)
      • 实际密钥是从另一个密钥或密码派生而来的吗?
        • 使用哪个密钥派生函数,它们的参数是什么? PBKDF2、bcrypt、scrypt、...
        • IV 是否与密钥一起派生? (通常通过从密钥派生函数请求密钥大小 + IV 大小输出)
    • 密码特征:
      • 分组密码,如 AES、Triple DES、Twofish、Rijndael、...
        • 加密参数,例如块大小,以防它是可变的
      • CBC、CTR、CFB 等操作模式...
        • 对于基于 IV 的模式:IV 是如何生成的?是随机生成并放入容器格式,还是与密钥一起从密码中导出,因此不需要放入密文容器中?
        • 对于 CTR 等基于 nonce 的模式:nonce 有多大(有时称为 IV)?
        • 对于 CFB 等参数化模式:分段有多大?
      • 填充模式,如 PKCS#7 填充(也称为 PKCS#5 填充)、ZeroPadding、...
    • 身份验证(如果有):
      • 作为 GCM、EAX、SIV 等操作模式...
      • 作为单独的 encrypt-then-MAC/MAC-then-encrypt/encrypt-and-MAC 方案,使用 HMAC-SHA256、CMAC、HKDF、GHASH 等 MAC ......
    • 每个组件的编码,如 Hex、Base32、Base64 或简单的二进制(无编码)
      • 是所有内容都从完成的二进制格式一起编码成文本格式,还是将组件单独编码并连接在一起?
    • 格式:
      • 在哪里放置 IV/nonce/salt(如果有)? (通常在实际密文之前)
      • 在哪里放置身份验证标签(如果有)? (通常在实际密文之后)
      • Cryptographic Message Syntax 适用吗?

    【讨论】:

    • 非对称密码学是一个更大的蠕虫罐,最好保持关闭状态,除非你知道自己在做什么。
    猜你喜欢
    • 2011-07-14
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多