V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lxk11153
V2EX  ›  问与答

有 相同输入但每次输出不同 的编码方式/算法吗?

  •  
  •   lxk11153 · 2020-07-08 16:17:16 +08:00 · 2792 次点击
    这是一个创建于 1379 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 输入相同内容
    2. 每次输出结果不同
    3. 拿 2 的结果去解码得到 1

    反例: 把"zxcvbn"拿去 base64,每次结果都一样

    第 1 条附言  ·  2020-07-08 22:59:14 +08:00
    • 场景: 比如 A 站回帖个 base64 的联系方式,B 站回帖个 base64 的联系方式,搜索引擎一搜,AB 站的账号就关联到同一个人了
    • 常用方案: 见14楼,联系方式加上一些干扰然后base64
    • 大家说的非对称加密,对称加密,凯撒移位啊,是可以做到,但对方一技术小白,如何让他方便的解密
    • 别想得太多,不用安全性,信息也没什么价值,就是14楼说的”简单的对抗“即可
    36 条回复    2020-10-01 10:51:36 +08:00
    kop1989
        1
    kop1989  
       2020-07-08 16:19:25 +08:00
    密钥可变么?如果密钥可变就可以。
    比如以当前时间年月日作为密钥,今天生成的和明天生成的密文就不同,但通过对应的密钥可以恢复为同样的明文。
    kop1989
        2
    kop1989  
       2020-07-08 16:21:20 +08:00
    反之,如果密钥不可变,加密效果就会很差,因为会导致多个密文对应一个明文。非常容易被人暴力破解。
    lxk11153
        3
    lxk11153  
    OP
       2020-07-08 16:26:14 +08:00
    @kop1989 #1 有不使用密钥的吗?我只是想每次结果不同,不需要安全性高,编码算法即可(可以不用加密算法)
    (这里好像可以延伸出一个办法: 使用时间戳作为密钥,把密钥拼接在输出上,解码时先区分密钥和密文,然后解码。但是这种方法就是不像 base64 这种被大家熟知,随便找个网站 /命令行都可以解码)
    kop1989
        4
    kop1989  
       2020-07-08 16:34:14 +08:00
    @lxk11153 #3 抱歉没理解清楚,如果是只编码的话,就爱莫能助了,没听说过。
    不过能不能大概透露下使用场景,我思考了以下你这种方式貌似只有缺点没有好处😂
    murmur
        5
    murmur  
       2020-07-08 16:34:25 +08:00   ❤️ 1
    我记得 RSA 这些非对称加密每次的结果似乎都不一样
    SuperMari0
        6
    SuperMari0  
       2020-07-08 16:34:33 +08:00   ❤️ 1
    这不就是 rsa 么
    SuperMari0
        7
    SuperMari0  
       2020-07-08 16:35:17 +08:00
    不过 rsa 不算是编码
    lxk11153
        8
    lxk11153  
    OP
       2020-07-08 16:42:42 +08:00
    @kop1989 #4 我举个例子,比如 A 站回帖个 base64 的联系方式,B 站回帖个 base64 的联系方式,搜索引擎一搜,AB 站的账号就关联到同一个人了
    @murmur #5 ↑
    @SuperMari0 #6 ↑
    hyperbin
        9
    hyperbin  
       2020-07-08 16:50:52 +08:00 via Android
    数学上不可能,输入变量有变化输出变量才会有变化
    darknoll
        10
    darknoll  
       2020-07-08 17:22:32 +08:00
    没有
    churchmice
        11
    churchmice  
       2020-07-08 17:25:40 +08:00
    lz 先说你的原始需求吧
    感觉你走错路了
    0DBBFF
        12
    0DBBFF  
       2020-07-08 17:26:24 +08:00
    @lxk11153 如果只是解决这种问题,你可以在原始数据后面加空格,base64 输出就不同。一般不应该阅读还是能成功联系你还不会暴露同一人
    zhs227
        13
    zhs227  
       2020-07-08 17:28:23 +08:00   ❤️ 3
    参考对称加密的 IV,用前面的字符表示向量,后面加密。举例,想加密的数是 3,我可以输出:
    5-2
    7-4
    113-110
    然后以某个随机数 rand 就可以了
    JeffGe
        14
    JeffGe  
       2020-07-08 18:03:44 +08:00 via Android
    仅以你 3# 的需求 8# 的场景来说,利用一些简单的对抗自动采集或机器审查的手段替换原文就行了,例如对以下文本进行 base64
    [email protected]
    someone(at)example.com
    {[email protected]}
    som 删 eon 除 e@exa 汉 mple.c 字 om
    lxk11153
        15
    lxk11153  
    OP
       2020-07-08 18:20:07 +08:00
    @churchmice #11 参见 8 楼
    @0DBBFF #12 没用的,虽然加了干扰,输出的整串是不同了,但关键信息所在的子串是一样的
    @zhs227 #13 想法感觉不错耶,你比如说我想回帖"😁笑",我可以回
    - String.fromCodePoint(0x1f600+1,0x7b10+1)
    - String.fromCodePoint(0x1f601+0,0x7b11+0)
    - String.fromCodePoint(0x1f602-1,0x7b12-1)
    chizuo
        16
    chizuo  
       2020-07-08 18:25:22 +08:00
    建议楼主上一些网络安全,密码学的课。真的,就是提的问题很幼稚,但是题主却很认真,所以希望你可以去读一下书或上一下课,更能帮助你。
    mlnotes
        17
    mlnotes  
       2020-07-08 18:31:49 +08:00
    RSA 啊,public key 加密相同的内容,每次密文都不一样,但用 private key 解密出来的内容又都是一样的
    lxk11153
        18
    lxk11153  
    OP
       2020-07-08 18:38:04 +08:00
    @mlnotes #17 参见 3 楼,"但是这种方法就是不像 base64 这种被大家熟知,随便找个网站 /命令行都可以解码"

    只想做一些类似 14 楼那样的简单对抗,并不用那么安全,以及让别人解不开,想要的是让别人可以方便的解开,但避免相同来简单对抗下信息关联(参见 8 楼)
    lxk11153
        19
    lxk11153  
    OP
       2020-07-08 18:39:11 +08:00
    @chizuo #16 像极了前女友说的"你是个好人,但我们不合适" :doge
    misdake
        20
    misdake  
       2020-07-08 18:55:11 +08:00
    要用某种可反向操作的规律向输入数据中加一些冗余且相对随机的数据,用某种一一对应地编码跑一遍生成“密文”,解密的时候把冗余数据剔除,重组成原文。
    用你上面 base64 的例子的话,如果安全要求不高,可以在输入的每个 bit 之间都插入一个随机的 0 或 1,然后 base64 。解密的时候把中间的 bit 都去掉重组。
    misdake
        21
    misdake  
       2020-07-08 18:59:48 +08:00
    如果对安全性毫无要求,甚至可以直接随机一个密钥,用某种对称加密算法来加密。分享的时候同时提供密文和密钥。
    reus
        22
    reus  
       2020-07-08 19:04:27 +08:00
    所有需要 iv 加密的对称加密都是啊
    Corua
        23
    Corua  
       2020-07-08 19:08:02 +08:00
    @murmur rsa 也要看填充方式的,pkcs 每次可以填充随机字节来加密,但解密后填充的部分会被忽略掉
    ipwx
        24
    ipwx  
       2020-07-08 19:13:46 +08:00
    楼主需要的那东西叫做 IV
    systemcall
        25
    systemcall  
       2020-07-08 19:26:01 +08:00 via Android
    你可以在个人介绍上放个公钥,每次发东西就拿私钥加密,内容多混淆几次
    但是采集可能是人工采集,人力并不贵,如果是有价值的东西就可能那样子做。比如以前的人工打码平台就是请了一堆人手动打码
    PHPer233
        26
    PHPer233  
       2020-07-08 19:27:21 +08:00 via Android
    RSA 加密就是你说的这种情况
    Hconk
        27
    Hconk  
       2020-07-08 19:40:33 +08:00 via iPhone
    生成随机数,范围可以尽量大,然后用这个随机数作为密钥随便找一种对称加密算法加密,把密钥和加密结果拼接成一个字符串,应该符合了吧。只要随机数范围足够大就能让密钥重复出现的概率低到可以忽略。
    lshero
        28
    lshero  
       2020-07-08 20:11:01 +08:00
    @lxk11153 丢个 jwt token 让用户去 jwt.io 查看 payload
    Nich0la5
        29
    Nich0la5  
       2020-07-08 22:37:47 +08:00 via Android
    加随机数然后用一些经典对称加密手段就好了。
    举例
    输入 abcd 然后加上 123 组成 abcd123 然后每位+1bcde234 再栅格错位 bd24ce3,计算量足够小,还原也简单
    ob
        30
    ob  
       2020-07-08 22:44:15 +08:00 via Android
    #17 楼说的对
    lululau
        31
    lululau  
       2020-07-08 22:52:27 +08:00
    #!/bin/bash

    sed “s/^/$(uuidgen)/“
    churchmice
        32
    churchmice  
       2020-07-09 11:02:26 +08:00
    @lxk11153 你这玩意本质也是输入变了

    如果这样,还不如
    随机数 1+明文+随机数 2

    然后加密,解密的时候把前后随机数剔除
    af463419014
        33
    af463419014  
       2020-07-09 14:44:59 +08:00
    @lxk11153 rsa 就是随便找个网站就能加密解密,跟 base64 一样方便
    lxk11153
        34
    lxk11153  
    OP
       2020-07-09 16:02:14 +08:00
    @af463419014 #33 实现 rsa/aes 并不难,重点是 rsa 的细节要保持一致,什么 CBC/ECB, 各种 Padding,再加上 key,已经好几个配置项了

    @churchmice #32 类似 14 楼,”对输入加上一些干扰“与标题“相同输入”确实有些出入了,但也是符合我的意图的,就是说 1. 相同的输入或者加上干扰,但这干扰对小白们也是可以方便移除的 2. 可以不用安全性,只是避免相同来简单对抗下信息关联 3. 如果是一个编码 /加密算法的话,小白门要能方便的解码出来
    jifengg
        35
    jifengg  
       2020-07-10 17:39:37 +08:00
    function encode(str){return btoa(Array.from(str).map(a=>a+parseInt(Math.random()*10)).join(''));}

    function decode(str_base){let m='';Array.from(atob(str_base)).forEach((v,i)=>{m+=i%2==0?v:'';});return m;}

    这个算法是,在邮箱地址每个符号中插入一个随机字符[0-9]。解码的时候只取下标为偶数的字符拼接。
    lxk11153
        36
    lxk11153  
    OP
       2020-10-01 10:51:36 +08:00
    以#8 的场景,或者用 paste.ubuntu.com + 失效时间 来分享
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5858 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 01:49 · PVG 09:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.