gpt4 book ai didi

c# - 如何使用 Bouncy CaSTLe 解密 AES/CCM 加密密文?

转载 作者:太空狗 更新时间:2023-10-29 19:46:05 30 4
gpt4 key购买 nike

加密

加密是用Stanford Javascript Crypto Library完成的(SJCL)。下面是一个完整的加密示例,分为两部分。第一个是关于使用 PBKDF2 进行基于密码的 key 推导。 .在第二部分中,实际加密是使用派生 key 和 initialization vector 进行的。 (四).请注意,salt 和 IV 是硬编码的,因此更容易提供 C# 解密解决方案。

// Key derivation…
var password = "password";
var salt = sjcl.codec.hex.toBits(
"5f9bcef98873d06a" // Random generated with sjcl.random.randomWords(2, 0);
); // Hex encoded with sjcl.codec.hex.toBits(randomSalt);
var iterations = 1000;
var keySize = 128;
var encryptionKey = sjcl.misc.pbkdf2(password, salt, iterations, keySize);

// Encryption…
var blockCipher = new sjcl.cipher.aes(encryptionKey);
var plainText = sjcl.codec.utf8String.toBits("secret");
var iv = sjcl.codec.hex.toBits("8291ff107e798a29");
var adata = ""; // What is adata?
var tag = 64; // What is tag? I think it is authentication strength.
var cipherText = sjcl.mode.ccm.encrypt(blockCipher, plainText, iv, adata, tag);

encryptionKey 变量的值:

  • SJCL 位数组:[ -74545279, -553931361, -1590906567, 1562838103 ]
  • Hex编码:fb8e8781defbad9fa12cb1395d270457
  • Base64编码:+46Hgd77rZ+hLLE5XScEVw==

iv 变量的值:

  • SJCL 位数组:[ -2104361200, 2121894441 ]
  • 十六进制编码:8291ff107e798a29
  • Base64 编码:gpH/EH55iik=

cipherText 变量的值:

  • SJCL 位数组:[ 1789401157, -1485204800, -440319203, 17593459146752 ]
  • 十六进制编码:6aa81845a77992c0e5c1431d4be2
  • Base64 编码:aqgYRad5ksDlwUMdS+I=

问题

问题是:

如何用 Bouncy Castle 解密密文?


在下面的 jbtule 的帮助下工作的解密示例

using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;

namespace SjclHelpers {

public static class Encryption {

/// <summary>Decrypts the cipher text.</summary>
/// <param name="cipherText">The cipher text.</pararesm>
/// <param name="key">The encryption key.</param>
/// <param name="initializationVector">The IV.</param>
/// <returns>The decrypted text.</returns>
public static byte[] Decrypt(this byte[] cipherText,
byte[] key, byte[] initializationVector) {
var keyParameter = new KeyParameter(key);
const int macSize = 64;
var nonce = initializationVector;
var associatedText = new byte [] {};
var ccmParameters = new CcmParameters(
keyParameter,
macSize,
nonce,
associatedText);
var ccmMode = new CcmBlockCipher(new AesFastEngine());
var forEncryption = false;
ccmMode.Init(forEncryption, ccmParameters);
var plainBytes =
new byte[ccmMode.GetOutputSize(cipherText.Length)];
var res = ccmMode.ProcessBytes(
cipherText, 0, cipherText.Length, plainBytes, 0);
ccmMode.DoFinal(plainBytes, res);
return plainBytes;
}}}

我得到一个 System.ArgumentException。我认为它是在提示其中一个字节数组太短。

Boncy CaSTLe 可在 NuGet 站点的以下位置获得:http://nuget.org/packages/BouncyCastle .


关于

AES/CCM 解密解决方案将成为 SjclHelpers 的一部分项目 CodePlex并将作为 NuGet 包发布。

最佳答案

据我所知:

  1. Nonce 应该是 IV。
  2. 通常您使用 AeadParameters 而不是 CcmParameters 但这可能仍然没问题,当然不要用 ParametersWithIV 包装它
  3. associateText 是可选的,因为如果您需要,CCM 可以验证与您的加密数据相关的未加密数据。您可能需要一个参数,因为它需要与 sjcl adata 相同,并且传输方法可以是任何东西。
  4. tagmacSize 相同是正确的。
  5. DoFinal 应该是 ccmMode.DoFinal(plainBytes, res);
  6. 为了安全起见,解密后,您应该将密文的最后 (macSize/8) 个字节与 ccmMode.GetMac() 进行比较以检查身份验证。<
  7. var plainBytes = new byte[ccmMode.GetOutputSize(cipherText.Length)]

关于c# - 如何使用 Bouncy CaSTLe 解密 AES/CCM 加密密文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10396762/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com