V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heavyrainn
V2EX  ›  程序员

请教各位,有什么加密算法是输入明文和输出密文长度等长呢?

  •  
  •   heavyrainn · 2020-03-13 07:23:08 +08:00 · 4600 次点击
    这是一个创建于 994 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在研究一些数据加密的东西,例如从一个环境把数据加密扔到另外一个环境去做分析。其中有一个场景是数据库加密交互,假设生产环境导出加密数据给开发环境,这里要求加密后的密文需要与输入的明文等长,因为在业务上有一些硬性规定,例如机位码必须是 16 位等等,请问有什么加密算法能够实现呢?谢谢大家
    18 条回复    2022-03-05 09:42:18 +08:00
    geelaw
        1
    geelaw  
       2020-03-13 07:31:23 +08:00 via iPhone
    你需要的是确定性加密( deterministic encryption )。有现成实现的加密算法通常具有 CPA 安全性(实际上一般是 AEAD 或 CCA ),密文必须比明文长,所以很可能需要自己造轮子。
    areless
        2
    areless  
       2020-03-13 07:41:40 +08:00 via Android
    大部分对称加密加密后占用字节数是一样的。只是转 hex 或者 base64 以及 asc,比字节码表示要长 。
    loading
        3
    loading  
       2020-03-13 07:56:41 +08:00
    不安全的 AES 可以了解一下,结合 AES 做点内部修改,凑合用一下?
    yzwduck
        4
    yzwduck  
       2020-03-13 08:33:51 +08:00
    所有的流加密 / stream cipher 都能保证密文长度与明文相同。
    使用 OFB 或 CTR 模式的块加密 / block cipher 也可以做到输入输出长度相同,不过前提是把初始向量 IV 当作密钥的一部分。
    如果不介意密文长度比明文多十几字节的话,大部分对称加密都能满足需求。

    PS: 我不知道你打算如何管理密钥,如果设计 / 管理不善,加密就形同虚设;
    PS2: 做分析的话,应该考虑一下差分隐私这种方法。传统的对称加密不一定能保护这种数据的机密性。
    xuanbg
        5
    xuanbg  
       2020-03-13 08:34:59 +08:00
    位交换算法的输出和输入等长,但没有密钥,任何人只要知道算法都可以解密。
    passerbytiny
        6
    passerbytiny  
       2020-03-13 08:47:31 +08:00
    别得不懂,但是密文与明文等长,看你的情况还是特定数据段的密文恒定长度,这样情况下解密的难度是成比例缩小的。

    话说你举例的场景是分析密文来判断原始环境的情况,这样的情况下我感觉:加密的好就分析不出东西,能分析出东西加密就是脱裤子放屁。这种场景,脱敏比加密好用。
    jinliming2
        7
    jinliming2  
       2020-03-13 09:00:58 +08:00 via iPhone
    简单的:凯撒密码……这个密码就是一个数字,明文和密文肯定等长。
    或者直接循环 xor,密码可以是任意长度的字符串,明文和密文也肯定等长。
    当然,这两种的安全性就难说了……
    SoloCompany
        8
    SoloCompany  
       2020-03-13 09:02:51 +08:00
    基本上所有 block cipher 都能满足你的需求, 只要满足输入时 blocksize 的整数倍 (一般都是 16 或 32), 加密过程 (cipher) 和 padding 算法一般都是独立的, 使用 no padding 或直接使用裸的 cipher 来实现
    reus
        9
    reus  
       2020-03-13 09:13:42 +08:00 via Android
    直接用 gcm-aes-256
    wordsman
        10
    wordsman  
       2020-03-13 09:16:56 +08:00
    确定性加密可以用模糊算法和语言常用字词匹配破解的,二战时期就能做到了
    DGideas
        11
    DGideas  
       2020-03-13 09:22:17 +08:00
    赞同 #7,请考虑密钥长度大于等于原文的 XOR 算法。

    对于一次一密码本的 XOR 算法,只要密钥的生成足够具有随机性,该算法是密码学安全的。
    ETiV
        12
    ETiV  
       2020-03-13 10:04:21 +08:00 via iPhone
    等长最简单了,给每个字节 XOR
    jimzhong
        13
    jimzhong  
       2020-03-13 11:04:48 +08:00
    在没有 Authentication 需求侠,Block cipher 可以用 Ciphertext stealing mode 实现 LZ 的需求。
    l404864087
        14
    l404864087  
       2020-03-13 11:18:42 +08:00
    凯撒加密..
    kuro1
        15
    kuro1  
       2020-03-13 11:34:45 +08:00
    AES-CTR,把 VI 作为密钥的一部分
    contmonad
        16
    contmonad  
       2020-03-13 13:39:20 +08:00
    赞同 @yzwduck #4。另外字段太短就没法用 ciphertext stealing 了。
    TransAM
        17
    TransAM  
       2020-03-13 13:57:18 +08:00 via Android
    保证安全的话,只能是一次性密码本了。。
    louted
        18
    louted  
       272 天前
    chacha20/rc4
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1181 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 23:05 · PVG 07:05 · LAX 15:05 · JFK 18:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.