当前位置: 首页 > 知识库问答 >
问题:

我如何解密AES/CCM加密密码文本与反弹城堡?

舒博雅
2023-03-14

加密是使用Stanford Javascript加密库(SJCL)完成的。下面是一个完整的加密示例,分为两部分。第一个是关于PBKDF2的基于密码的密钥派生。在第二部分中,使用派生密钥和初始化向量(IV)进行实际加密。注意,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);
    null

IV变量的值:

  • SJCL位阵列:[-2104361200,2121894441]
  • 十六进制编码:8291FF107E798A29
  • Base64编码:GPH/EH55iik=

ciphertext变量的值:

    null
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;
        }}}

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

共有1个答案

麹正业
2023-03-14

从我所看到的:

  1. nonce应该是iv。
  2. 通常使用aeadparameters而不是ccmparameters,但这可能还是可以的,当然不要用parameterswithiv包装它
  3. associateText是可选的,因为如果需要,CCM可以对与加密数据相关的未加密数据进行身份验证。您可能需要一个参数,因为它需要与sjcladata相同,并且传输的方法可以是任何东西。
  4. tagmacsize相同是正确的。
  5. doFinal应为ccmmode.doFinal(plainBytes,res);
  6. 为了安全起见,解密后,应将密文的最后(MacSize/8)字节与CCMMODE.GetMac()进行比较,以检查身份验证。
  7. var plainBytes=新字节[ccmmode.getoutputsize(密码文本.length)]
 类似资料:
  • 我想做一个简单的应用程序加密/解密与AES的消息。我的代码似乎现在工作,因为我得到的文本加密和解密没有任何问题。 我有一个输入字段、一个输入密码用于解密/加密的字段和一个输出字段。和两个按钮(加密/解密)。 问题是****,当我输入一条消息,设置密码并对其进行加密,然后试图引发无效的密码获取时,尽管输入的密码与我用于加密的密码不匹配,但消息还是会解密。 下面是我的密钥生成代码: 这里是我加密消息的

  • 为什么PHP解密方法不能解密用Java加密的数据? 当我仅使用Java或仅在PHP中加密和解密数据时,一切工作都很好。 加密的数据被发送到服务器,在那里我尝试用PHP openssl_decrypt对其进行解密 不幸的是,openssl_decrypt返回一个空字符串。

  • 执行此操作后,当运行/opt/bin/openssl密码时,列表中看不到aes-128-ccm密码: 但如果运行/opt/bin/openssl enc-help 2>&1,我会看到“-aes-128-ccm”: 我使用命令(在前面提到的文章中给出)重新安装了ruby 2.0.0p0和rvm。然后运行。返回以下错误: 我的问题是如何在Ruby中添加对AES-128-CCM的支持/我在这里做错了什么

  • 我是加密新手。这个问题是我上一个问题的子问题。我有一个用OpenSSL util加密的文件: 我用这个代码来解密它: 而且很有效。但这是一个测试案例。实际情况是,我用以下参数对文件进行了加密: openssl aes-256-cbc-nosalt-in fileIn-out fileOUT-p-k KEY 请注意,出现了'-no盐'参数。问题是PBEKeySpec需要不为空,也不为空的和参数。它也

  • 问题内容: 我迅速编写了一个应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案中接收了加密数据,但是我找不到解决办法。 这是我的.net加密: 我需要迅速解密功能。 问题答案: 我找到了解决方案,它是一个很好的库。 跨平台256位AES加密/解密。 此项目包含在所有平台(C#,iOS,Android)上均可使用的256位AES加密的实现。关键目标之一是通过简单的实现使AES在所有平台

  • 问题内容: 我找到了在PHP中对字符串进行编码/解码的示例。起初它看起来非常好,但是不会起作用:-( 有人知道问题出在哪里吗? 结果是: 加密: 解密: 问题答案: 并且 在您的代码中未定义。查看有效的解决方案( 但不安全! ): 停! 这个例子是 不安全的! 不要使用它! **但是此代码中还有其他问题,使其变得不安全,尤其是使用ECB(这不是_加密_模式,只能在其上定义加密模式的构造块)。