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

有没有可逆的、能够保留原数据格式的数字加密算法

  •  
  •   reid2017 · 2018-06-11 16:01:13 +08:00 · 5058 次点击
    这是一个创建于 2138 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,需要对一串数字字符串进行加密,但必须保留原数据格式,即加密后仍是数字,且长度一致
    如:「 12345 」-> 「 56789 」

    要求算法是可逆的,即能够解密出原数据是什么

    或者说应该叫『混淆』算法

    有没有 V 友能够给点思路如何实现?

    用 java 的就最好了
    16 条回复    2019-07-30 15:09:05 +08:00
    crazyzzm
        1
    crazyzzm  
       2018-06-11 16:07:07 +08:00   ❤️ 1
    简单的加减乘除混合就行
    zhicheng
        2
    zhicheng  
       2018-06-11 16:11:19 +08:00 via iPhone
    所有的字符串都可以转换成一串组数字。
    hyq
        3
    hyq  
       2018-06-11 16:12:21 +08:00
    rot13
    cctv1005s927
        4
    cctv1005s927  
       2018-06-11 16:12:54 +08:00
    压缩算法了解一下?
    zhujinliang
        5
    zhujinliang  
       2018-06-11 16:15:32 +08:00
    打个表,一共 5 个数字的话就做 5 个数组,每个数组表示从 0 到 9 的替换关系,比如[9,7,5,3,1,0,8,6,4,2]表示用 9 替换 0,7 替换 1,5 替换 2...每位做一个表,加密时正向替换,解密时逆向替换
    moln
        6
    moln  
       2018-06-11 16:18:45 +08:00
    直觉告诉我这样的加密安全性很低
    moln
        7
    moln  
       2018-06-11 16:22:21 +08:00
    生成一个等长的伪随机数做异或运算吧,解密的时候生成同样的伪随机数再异或一次就行了
    VoidChen
        8
    VoidChen  
       2018-06-11 16:30:44 +08:00
    借个楼问下有没有相关的文本压缩算法
    tomychen
        9
    tomychen  
       2018-06-11 16:32:57 +08:00
    我说 xor 会挨打不 (逃
    fcce
        10
    fcce  
       2018-06-11 16:35:34 +08:00
    xor
    pelloz
        11
    pelloz  
       2018-06-11 16:38:15 +08:00
    恺撒加密,安全性=无
    shakoon
        12
    shakoon  
       2018-06-11 16:40:14 +08:00
    楼主你说的这不叫加密,叫散列,或哈希,安全性基本不能保证
    annielong
        13
    annielong  
       2018-06-11 16:46:57 +08:00
    以前记得有个 6*6 的网格加密方法,本质是纸上游戏,但是可以转换成电子版,首先做一个 6*6 的网格,然后分成 3*3 的 4 个,每个 3*3 里面写上 1-9,然后按数字顺序 1-9,从每个 3*3 里面涂掉一个数字,一直到每个 3*3 里面只剩一个数字,这时候把数字格扣掉,使用的时候把 6*6 的网格放在纸上,在扣掉的洞里面写字,写完旋转 90 度继续写,直到写满 36 个字符,
    liberize
        14
    liberize  
       2018-06-11 17:23:26 +08:00
    ROT13 +1
    oott123
        15
    oott123  
       2018-06-11 23:00:21 +08:00
    1. 编码:把你要加密的数字用二进制表示。
    2. 加密:应用任何密码学算法加密。
    3. 解码:把加密后的二进制结果用十进制表示。

    同理,可替换任何编码解码算法达成你的目标。
    stillwaiting
        16
    stillwaiting  
       2019-07-30 15:09:05 +08:00
    偶然搜索到这个主题。。
    参考下 https://github.com/idealista/format-preserving-encryption-java
    https://en.wikipedia.org/wiki/Format-preserving_encryption
    这个实现的应该是 NIST 的 FF1 和 FF3
    要实现其他保持特有格式,比如信用卡号、日期,需要参考下相关论文,目前没有看到相关实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5734 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:21 · PVG 10:21 · LAX 19:21 · JFK 22:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.