V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nnnToTnnn
V2EX  ›  程序员

今天发现一个帖子上提到过,不可逆的加密算法。

  •  
  •   nnnToTnnn ·
    jhoneybee · 2020-04-11 09:30:31 +08:00 · 7802 次点击
    这是一个创建于 1721 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问一下大家什么叫做不可逆的加密算法? 目前我仅仅只是知道散列算法,取 hash 值。

    例如 sha512

    明文

    123

    密文

    3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2

    解密逻辑就很简单了,找一台运算速度比较高的电脑生成所有字符串的组合。依次对比结果集,不久可以逆向出来密码了吗?

    第 1 条附言  ·  2020-04-11 15:03:28 +08:00
    因为提到不可逆的加密算法导致我有点不太理解。


    因为我只指导非对称加密,以及对称加密。 还有信息摘要算法。 所以我才问大家什么叫做不可逆的加密算法?

    楼下说的 md5,以及 rsa 等算法,都是可以通过碰撞来进行可逆的。所以我才对不可逆的加密算法产生疑惑。


    我看了所有帖子。

    大家说的意思是,没有所谓的不可逆的加密,这个只不过是翻译或者其他导致的,应该只有信息摘要算法,也就是 Hash 对吗?
    67 条回复    2020-06-18 12:11:37 +08:00
    redeemer1001
        1
    redeemer1001  
       2020-04-11 09:37:36 +08:00
    hash 不是加密啊朋友…
    nnnToTnnn
        2
    nnnToTnnn  
    OP
       2020-04-11 09:40:40 +08:00
    @redeemer1001 我了解到的不可逆向的符合此特征似乎只有 hash 。不知道那种加密算法,可以不可逆,如果不可逆,那么加密出来的内容也无任何意义了。。。

    > 我对加密算法不是很了解 T - T 这是我个人的理解。 望纠正
    sunziren
        3
    sunziren  
       2020-04-11 09:43:17 +08:00   ❤️ 11
    给一个 2W 字的论文写一个 200 字的摘要,然后你能通过这 200 字的摘要还原出原来的论文吗?这就是不可逆 -逃
    HTSdTt3WygdgQQGe
        4
    HTSdTt3WygdgQQGe  
       2020-04-11 09:44:12 +08:00 via Android
    问题是计算速度多高
    hanqi7012
        5
    hanqi7012  
       2020-04-11 09:45:45 +08:00 via iPhone
    摘要 能理解吧
    maemual
        6
    maemual  
       2020-04-11 09:45:51 +08:00 via iPhone
    “不可逆的加密算法”这个说法就是错误的,所以没有讨论的必要。
    哈希散列根本不是加密算法
    wizardoz
        7
    wizardoz  
       2020-04-11 09:48:35 +08:00   ❤️ 1
    hash 是多对一的,你找到一个数据能够得到一样的 hash,但是这个数据未必是我当初的那个数据。
    PopRain
        8
    PopRain  
       2020-04-11 09:50:53 +08:00
    散列不是加密,是防篡改。。。(更完善还要数字签名配合)

    公开密钥就算是你说的“不可逆加密” ,根据公开的足够长的公开密钥,合理的时间内你不可能从密文得到原文。
    lewinlan
        9
    lewinlan  
       2020-04-11 09:52:16 +08:00 via Android
    可逆的意思是可以通过忽略不计的代价逆向计算,典型例子是公钥。
    那种暴力破解不叫逆向。
    chizuo
        10
    chizuo  
       2020-04-11 09:55:24 +08:00
    随便看一门网络安全的书或者课,就能解决你的疑惑。
    xuanbg
        11
    xuanbg  
       2020-04-11 10:01:47 +08:00
    不可逆的算法都不能叫加密算法,原因很简单,因为没法解密啊。

    你这种还原的办法叫做暴力破解,不叫解密。比你的办法更好的办法是彩虹表,具体的自己可百度。
    learningman
        12
    learningman  
       2020-04-11 10:04:37 +08:00   ❤️ 1
    我这有个 170G 的游戏,现在我打成一个压缩包求个 MD5 抄在纸上,你能把他变回这 170G 吗
    baoyexi
        13
    baoyexi  
       2020-04-11 10:12:01 +08:00   ❤️ 3
    这回轮到 Shannon 的棺材板盖不住了
    RickyC
        14
    RickyC  
       2020-04-11 10:15:21 +08:00
    不存在绝对不可逆的算法吧?

    在有大数据的情况下, 把加密结果和待加密文字都匹配储存, 形成一个特别大的数据库,

    对于广大用户来说, 应该不存在绝对安全的不可加密算法.
    hoyixi
        15
    hoyixi  
       2020-04-11 10:21:05 +08:00   ❤️ 1
    用英文讨论很清晰,用中文很快把你绕晕,尤其抠字眼的学术派,和没有学习过术语的日常派,根本不在一个频道
    harryhao
        16
    harryhao  
       2020-04-11 10:23:41 +08:00
    先区别加密算法和非加密算法,加密算法一般都是算法公开,密钥保密例如 aes,sha/md5 属于非加密算法, 算法公开,没有密钥
    MOONLIGHTT
        17
    MOONLIGHTT  
       2020-04-11 10:26:26 +08:00
    hash 主要用于防止需要传输的内容被非法篡改。虽然 hash 类似桶模型,存在一定的碰撞几率(不同的内容计算得到的 hash 值相同),但从数学上可以证明在篡改一些想更改的内容之后,再篡改一些无关内容使最终 hash 值相同是 [计算上不可行的] 。
    rrfeng
        18
    rrfeng  
       2020-04-11 10:51:18 +08:00 via Android
    不可逆和加密就是冲突的概念。
    那你干脆删除数据,也是不可逆加密。反正不要原始数据了。

    了解一下摘要 /签名
    shadeofgod
        19
    shadeofgod  
       2020-04-11 10:52:25 +08:00
    要分清 Hashing 和 Encryption,前者是 one way 的,后者是 two way 的,中文语境下很多人都把这两个叫加密但是严格来说 hashing 不算加密。

    说 hashing 是 one way 是因为没有办法通过逆转原有的 hash 过程来获取原本的数据,因为这个过程中往往会丢失一部分信息(比如取模运算是无法根据结果反向运算得到原来的数字),只能通过彩虹表之类的暴力碰撞方式。
    iyear
        20
    iyear  
       2020-04-11 11:00:24 +08:00
    hash 不是数据摘要么,和 rar 加密压缩完全不一样
    这个可以:1G 片子->32 位 md5
    这个不可以:32 位 md5->1G 片子
    icyalala
        21
    icyalala  
       2020-04-11 11:09:14 +08:00
    "不可逆的加密算法"? 没这个说法。。。
    不可逆那不叫加密。。
    Xusually
        22
    Xusually  
       2020-04-11 11:11:59 +08:00
    md5 -s a
    MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661

    md5 -s abcdefghij
    MD5 ("abcdefghij") = a925576942e94b2ef57a066101b48876

    md5 -s abcdefghij012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890
    MD5 ("abcdefghij012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890") = fc82b0bfe7009c54326529881164994c

    ls -lh ubuntu-20.04-beta-desktop-amd64.iso
    -rwxrwxrwx@ 1 youtellme staff 2.6G 4 6 22:20 ubuntu-20.04-beta-desktop-amd64.iso

    md5 ubuntu-20.04-beta-desktop-amd64.iso
    MD5 (ubuntu-20.04-beta-desktop-amd64.iso) = d3eff3d41d9d32a0b8a87e4faf8aef25

    md5 后的 hash 都是 32 位,那么 1 、10 、100 个字符,甚至下面 2.6GB 的文件,都是 32 位。
    这不叫加密,这叫摘要,32 位的字符串,反向无法解密,信息丢失不可避免。参考 香农定理
    cmdOptionKana
        23
    cmdOptionKana  
       2020-04-11 11:13:46 +08:00
    我好像突然明白楼主的意思了:

    假设已知原文是三个数字,那么,从 000, 001, 002 开始算 hash,一直算到 999, 同时与 hash 对比,通过碰撞来“解密”。

    在一定条件下,比如原文很短(三个字符),范围很窄( 0-9 ),这种方法也可以达到加密解密的目的。

    但并不是一个好方法(太浪费算力,而且与正规加密方法相比也没啥优点)。
    yulihao
        24
    yulihao  
       2020-04-11 11:17:41 +08:00
    @cmdOptionKana 要是密码真的像楼主那样那么简单,现在的 CPU 基本上都是秒吧?
    huayumo
        25
    huayumo  
       2020-04-11 11:19:36 +08:00
    不可逆,你加密了有什么用?
    lagoon
        26
    lagoon  
       2020-04-11 11:22:51 +08:00
    不可逆,直接销毁就是。干嘛加密?

    另外,加密本身的定义,就和不可逆违背。
    Godikov
        27
    Godikov  
       2020-04-11 11:26:36 +08:00
    不可逆还加什么密
    neteroster
        28
    neteroster  
       2020-04-11 11:30:19 +08:00
    * Hash 也就是散列函数:给定一些数据,输出一个摘要。

    「所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为散列碰撞( collision )。」——维基百科

    也就是说:由于 Hash 的输出通常是固定长度,而输入的数据可以是任意长度,所以碰撞不可避免的存在。
    也就是说:给定一个 Hash,通过穷举查找,不一定找到的是原来输入的数据,因为同一个 Hash 对应很多(也许是无穷多)个输入数据。

    * 加密:给定一个密码,一些明文,输出一些密文。

    结论:Hash 不是加密,更不是什么「不可逆加密」。
    qwerthhusn
        29
    qwerthhusn  
       2020-04-11 11:39:49 +08:00
    非可逆加密 RSA ECDSA
    cmdOptionKana
        30
    cmdOptionKana  
       2020-04-11 11:45:32 +08:00
    @yulihao 这只是举个例子,实际可以是更长一点。也可以是多个三位数的组合。

    他这样做确实可以做到类似于加密解密的效果,但这样做没什么好处。
    xFrye
        31
    xFrye  
       2020-04-11 11:54:16 +08:00
    @qwerthhusn 你确定 RSA 是 “非可逆加密” ?
    areless
        32
    areless  
       2020-04-11 11:59:11 +08:00 via Android
    加入 salt,你超算也没用。有个数学时间在里面的。比如 rsa 是可以破解的,大部分破解的理论值超过 20 年左右,所以密钥或者是 salt 是一年一更新才保证安全性
    bluefalconjun
        33
    bluefalconjun  
       2020-04-11 12:00:40 +08:00
    littlewing
        34
    littlewing  
       2020-04-11 12:08:53 +08:00
    不可逆还叫加密?那加密了有啥用
    lostpg
        35
    lostpg  
       2020-04-11 12:18:48 +08:00 via Android   ❤️ 1
    我推荐一本书嗷,图解密码技术,这本书能解决多数人对密码学的大多数疑问。
    mrcn
        36
    mrcn  
       2020-04-11 12:24:54 +08:00 via Android
    @learningman #12 歪个楼,magnet 可以,哈哈。
    Jooooooooo
        37
    Jooooooooo  
       2020-04-11 12:42:38 +08:00
    md5 就不可逆

    把任意一个字符串映射到单个字符上也不可逆
    wangxiaoaer
        38
    wangxiaoaer  
       2020-04-11 12:44:20 +08:00 via Android
    加密一定要能解密,你都不可逆了还加什么密?
    JerryCha
        39
    JerryCha  
       2020-04-11 12:48:55 +08:00
    一来 hash 不能加密,二来 hash 只是摘要,hash 函数都是一个无穷空间映射到有限空间的单向函数。
    你的确可以穷举( brute-force ),那么你有钱有时间穷举吗。你要不以每秒穷举 2^32 个组合的速度算算穷举完 2^512 种结果需要多少年?
    jugelizi
        40
    jugelizi  
       2020-04-11 12:50:36 +08:00 via iPhone
    月经贴
    绝大部分十年经验的程序员都不分 hash 和加密的概念
    反推的叫彩虹表 需要多大自己百度了再说
    sunmker
        41
    sunmker  
       2020-04-11 12:58:59 +08:00
    这个不是大学都教过的吗……
    wangyzj
        42
    wangyzj  
       2020-04-11 13:32:47 +08:00
    可逆不可逆的都有
    jwt 的 RS256 啥的那种是可逆的
    md5 是不可逆的
    EminemW
        43
    EminemW  
       2020-04-11 14:02:47 +08:00
    不可逆的不叫加密算法啊。。加密对应解密,不可解密的东西还叫加密算法?
    24bit
        44
    24bit  
       2020-04-11 14:06:26 +08:00
    message digest 消息摘要算法,不是加密算法吧
    vachiko
        45
    vachiko  
       2020-04-11 14:19:12 +08:00
    MD5 就不可逆,但它不能称之为加密,顶多算是个算法,因为不防碰撞,属于多对一关系。
    youxiachai
        46
    youxiachai  
       2020-04-11 14:22:25 +08:00 via iPad
    这是半路转行的吗。。。为啥会问这么奇怪的伪命题。。
    baoyexi
        47
    baoyexi  
       2020-04-11 14:24:42 +08:00
    @mrcn 哈哈哈哈哈哈哈哈哈哈
    yeqizhang
        48
    yeqizhang  
       2020-04-11 14:27:23 +08:00 via Android
    既然加密那就要能解密吧。
    不可逆的信息摘要算法,按我的理解是用来做特征,检验或者签名之类的。
    mengzhuo
        49
    mengzhuo  
       2020-04-11 14:30:04 +08:00
    加密是为了解密的,熵不变;而哈希熵会减少。
    p1gd0g
        50
    p1gd0g  
       2020-04-11 15:02:00 +08:00
    不久???
    密码学研究生黑人问号。
    nnnToTnnn
        51
    nnnToTnnn  
    OP
       2020-04-11 15:06:21 +08:00
    @bluefalconjun 我知道非对称加密,看到帖子里面的不可逆的加密算法有点打破了我的认知,所以才发帖询问以下,原来所谓的 “不可逆的加密” 指的是信息摘要,我还以为有出现了新世界 T-T
    nnnToTnnn
        52
    nnnToTnnn  
    OP
       2020-04-11 15:10:36 +08:00
    @areless 加入 salt 也只是减少了碰撞的几率,但是理论上还是可以根据原文,和加密的内容来进行碰撞结果。只不过是算力的问题。
    nnnToTnnn
        53
    nnnToTnnn  
    OP
       2020-04-11 15:17:29 +08:00
    @youxiachai

    可能我描述的有点歧义。

    标题中表达了两个意思

    1. 第一次听说过不可逆的加密算法,和我所接触到的知识有冲突,加密表示的一定会有解密,如果仅仅只能加密,这个文本将毫无意义,不可逆的加密算法也就无任何意义

    2. 我仅仅只是知道散列算法,用来做信息摘要,但是就算是信息摘要算法,也可以通过算力来进行碰撞,也存在解密的可能性。

    所以我很好奇,一。 不可逆的加密算法真实存在吗? 二。他是怎么做到防止碰撞的。


    结果发现所谓的不可逆原来指的信息摘要。好了,那没事了。打扰了。。。
    yidinghe
        54
    yidinghe  
       2020-04-11 15:35:58 +08:00
    https://segmentfault.com/a/1190000015688203 [如何区分“转码”、“签名”和“加密”]
    jhdxr
        55
    jhdxr  
       2020-04-11 15:42:24 +08:00
    @nnnToTnnn
    0. 目前我们平常使用的加密也好,哈希也罢,说的都不是绝对不可能还原,而是在能接受的时间内不可能被还原。注意这个能接受的时间也是相对概念,例如一个密文如果我们需要一天就能破解,通常我们会觉得这是能接受的,但破解完发现这个密文是每日开奖的彩票的号码,每次等你破解完,号码也已经公开了,那也就失去了破解的意义。
    1. hash 进行碰撞,实现的也并不是解密。你碰撞出来的结果,未必是我的明文,只是两者哈希值一样
    2. 目前的研究,只能做到已知明文 m,快速找出另外一个明文 n,使得 m 和 n 的哈希值相同
    3. 目前依然做不到给定任意哈希值 h,快速找出其对应的(任意一个)明文
    4. 通过穷举的方式去构造明文到哈希的映射,从而查表反推哈希对应的明文,在原理上可行的,在实际上也有人这么做(彩虹表)。但是如果你算一下储存需要占用的磁盘空间,就会发现以目前的技术,没法覆盖所有可能性
    mainjzb
        56
    mainjzb  
       2020-04-11 16:00:25 +08:00
    无法解密也是有意义的。
    密码都按 MD5 存到数据库里。用户登录的时候只要看加密的密文是否相等就能判断用户是不是登录成功。
    zlowly
        57
    zlowly  
       2020-04-11 18:57:14 +08:00
    1 、维基百科上解释,在密码学中,加密(英语:Encryption )是将明文信息改变为难以读取的密文内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。
    2 、解密是加密的逆向过程。如果没有这个逆向过程,那么那个正向过程,无论你是叫它哈希还是摘要什么的,它就是不能叫加密。
    dangyuluo
        58
    dangyuluo  
       2020-04-11 19:04:58 +08:00
    应该是翻译的问题,不可逆加密是没有意义的,毕竟加密是为了解密
    cmdOptionKana
        59
    cmdOptionKana  
       2020-04-11 19:51:50 +08:00
    @nnnToTnnn “不可逆的加密算法” 这是一个非常别扭的说法,很可能你看到的那个贴子本来就说错了。

    就好像如果有人把 ipad 称为 “不能打电话的 iphone 手机”,你一听就会觉得很别扭,你可能会想问对方是不是想说 ipad,并且你会想纠正他说 ipad 不是手机。

    这就是上面大家说 hash 不是加密的原因。


    “md5 等算法可以通过碰撞来进行实现可逆”,这个说法也是完全错误的,原因如下:

    1. 比如 md5, 存在多个字符串(比如字符串 A 、B 和 C )对应同一个摘要的情况,即就算你碰撞出来了,你还是不知道原文究竟是哪个。

    2. 像密码之类的短字符串还能尝试碰撞,但是你想想,如果是一张图片的 md5,你要怎么碰撞?把世界上所有图片都一一拿去试吗?

    3. 所谓的“可逆”,是指数学上的可逆。碰撞不能称为可逆,而且在现实之中(见上面加密图片的例子)通过碰撞来“解密”是没有现实意义的。

    这有点像一个著名的故事:给猴子一台打字机,它瞎敲无数遍之后,它甚至有可能敲出《罗密欧与朱丽叶》,但我们不会说猴子是大文豪。
    infinet
        60
    infinet  
       2020-04-11 20:05:34 +08:00
    楼主是不是指不可能破解的加密算法?有种算法绝对不可能破解:生成很多随机数写到光盘,然后复制一张光盘给对方,加密时把明文和光盘上的随机数 XOR,对方收到加密数据后同样和光盘上的随机数 XOR 得到明文。电影《潜龙轰天 2 》里好像有这个情节。
    eric6356
        61
    eric6356  
       2020-04-12 00:01:43 +08:00
    你说的这个解密又叫做挖矿
    20015jjw
        62
    20015jjw  
       2020-04-12 01:57:49 +08:00 via Android
    看个教程 /随便看俩视频再来问真的不难..
    HanShan63
        63
    HanShan63  
       2020-04-12 03:12:04 +08:00 via iPhone
    不可逆你怎么解密,你这不叫加密,叫销毁
    tsohgdivil
        64
    tsohgdivil  
       2020-04-12 06:30:45 +08:00
    求一个写不出来字的笔
    Quadox
        65
    Quadox  
       2020-04-12 14:05:31 +08:00
    在密码学中,加密(英语:Encryption )是将明文信息改变为难以读取的密文内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。——维基百科

    所以不可逆的加密就不应该叫加密了啊?
    julyclyde
        66
    julyclyde  
       2020-04-13 20:30:17 +08:00
    不是翻译导致的
    是没文化导致的
    lotosbin
        67
    lotosbin  
       2020-06-18 12:11:37 +08:00
    不可逆 指的是 加密算法 不可逆运算,
    比如移位加密,只要逆向移位 就是解密算法。
    但是 RSA 算法是的解密算法 不是 加密算法的逆运算。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 07:02 · PVG 15:02 · LAX 23:02 · JFK 02:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.