账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    chacha20流加密的解密问题
    52
    0

    ChaCha20 is a stream cipher developed by Daniel J. Bernstein. Its original design expands a 256-bit key into 2^64 randomly accessible streams, each containing 2^64 randomly accessible 64-byte (512 bits) blocks. It is a variant of Salsa20 with better diffusion.

    在用libsodium的库 chacha20流加密算法

    int crypto_stream_chacha20(unsigned char *c, unsigned long long clen,
                               const unsigned char *n, const unsigned char *k);

    第一个函数是不可逆的 不知道有什么意义 只能得到密文 把密文再扔进去什么都不变

    int crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,
                                   unsigned long long mlen, const unsigned char *n,
                                   const unsigned char *k);
                                   

    第二个函数可以
    1.将m用k,n计算输出c(密文)
    2.把m换成密文c则输出明文

    那么问题来了,如果你的密文缺了一段
    比如说一个4个char长度密文 0x01 0x02 0x03 0x04
    如果你缺了0x01 0x02 你是没有办法解密后面两个的
    但是你缺了0x03 0x04 前面两个还是可以解出明文

    这种情况也属于流加密?
    这不是块加密吗 这将明文定了界,要数据块完整才能正确解密啊

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • Chacha20是一种基于Caesar cipher的密钥分发算法,它的加密和解密过程如下:

      1. 加密:将明文向量a通过一个随机的Caesar cipher向量c生成密文c'。每个字符都会向后移动固定数量的位数,其中向上移动的位数对应于字母表中的字母,向下的移动的位数对应于字母表中的字母的逆序。

      2. 解密:将密文c'通过同样的随机Caesar cipher向量c生成明文a。每个字符都会向前移动固定数量的位数,其中向上移动的位数对应于字母表中的字母,向下的移动的位数对应于字母表中的字母的逆序。

      以下是一个简单的Python代码示例,用于演示如何使用Chacha20进行加密和解密:

      ```python import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Random import get_random_bytes

      定义Caesar cipher的密钥长度

      key_length = 20

      加密

      def encrypt(text, key): cipher = AES.new(key, AES.MODE_chacha20, padding=True) return cipher.encrypt(pad(text.encode(), key_length))

      解密

      def decrypt(cipher, key): cipher = AES.new(key, AES.MODE_chacha20, padding=True) return unpad(cipher.decrypt(cipher.iv), key_length)

      测试

      text = "Hello, world!" key = get_random_bytes(key_length) encrypted = encrypt(text, key) print("Encrypted text:", encrypted)

      decrypted = decrypt(encrypted, key) print("Decrypted text:", decrypted) ```

      注意:这个示例使用了Python的Crypto库。你需要先安装这个库,可以使用pip install python-cryptography命令进行安装。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部