吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2594|回复: 12
收起左侧

[讨论] 读书成诗-谜题的解

  [复制链接]
edzjx 发表于 2020-11-5 16:02
本帖最后由 edzjx 于 2020-11-16 21:08 编辑

实际上已经有2个帖子发帖咨询怎么解
读书成诗-谜题求解2
读书成诗-谜题求解

里面的答复中也已经给出了求解的办法。我也是看了很多楼层。
我这里汇总了下解体方便大家围观,给出Python3 ,Java,Dotnet 3种语言的测试代码。提供C的MD2算法调用源码。

题目:黑白皆算,对我等众猿而言中央C所在位置数优剃爱肤杠吧爱慕帝贰亿次的值是?
解:
1.破题

1.1黑白皆算,中央C所在位置(C do)

上图是一个标准的钢琴键盘示意图。这句话的意思黑键也算,从第一个数中央C是第40个(每组12按键(7个白键+5个黑键,第一组前有3个按键)。

1.2 对我等众猿而言
意思是从0开始索引,那么C do的位置值是39

1.3优剃爱肤杠吧 爱慕帝贰 贰亿次 的值
这句话是谐音,实际指的的是 UTF-8 MD2 2亿次的值。
MD2是历史悠久一个Hash加密算法,最初用于8位机这种嵌入式设备上,目前其安全性很低,不建议使用了。建议参考MD2算法作者原文上的测试结果,来验证自己语言的加密算法。(网上搜到其作者92年写的算法原文上面的C代码我直接拷贝到clan中也照样执行),Hash值这类算法一般输入是一个字节数组。所以UTF-8的意思,以UTF-8编码格式获取39的字节编码。2亿次的意思就说循环加密2亿次。实际上UTF-8对于此题没有意义,对于0x00-0x7F之间的字符(包含数字字母),UTF-8编码与ASCII编码完全相同。
破题后就是写代码来计算了。

2.解题代码
2.1PythonPython的代码最为简洁,我参考本站的贴子:
from Crypto.Hash import MD2
if __name__ == '__main__':
    #print_hi('PyCharm')
    txt = "39"
    # md2加密1亿次
    for i in range(200000000):
        txt = MD2.new(txt.encode("utf8")).hexdigest()#作为十六进制数据字符串值输出
    print(txt)
需要Python环境安装pycryptodome ,使用pip安装 pip install pycryptodome。

2.2Java
需要导入apache.commons.codec库。我建议建立Maven项目。这样方便在线导入依赖。否则手工需要去官网下载jar包,再导入jar包。代码书写起来简洁程度不亚于Python。

package com.company;
import org.apache.commons.codec.digest.DigestUtils;
public class Main {
    public static void main(String[] args) {
         
        String txt ="39";

        // MD2
        for(int i=0;i<200000000;i++){
            ///   public static byte[] md2(String data) {
            //        return md2(StringUtils.getBytesUtf8(data));
            //    }
            txt= DigestUtils.md2Hex(txt);
        }

        System.out.println(txt);

    }
}
2.3CSharp
C#的代码最为麻烦,首先C#官方库(System.Security.Cryptography)只有MD5加密算法,另外第三方收费库Chilkat .NET包含MD2算法,但是价格太贵。还好Mono中有。需要通过Nuget在项目里安装。再者C#加密类调用步骤都多一些,而且没有直接字符输出的功能。我这对此封装了方法,一个是进行字符串输出,一个是封装加密计算过程。使得最终调用的风格和上述两个代码类似。新建项目后,NutGet 搜索Mono.Security安装。
using System;
using System.Text;
using Mono.Security.Cryptography;

namespace testdemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string txt = "39";
            for (int i = 0; i < 200000000; i++)
            {
                txt = Md2Crypto(txt);
               
            }
               Console.WriteLine($"{txt}");            
        }

        public static string Md2Crypto(string source)
        {
            using (MD2 myMD2 = MD2.Create())
            {
                try
                {
                    byte[] input = Encoding.UTF8.GetBytes(source);
                    byte[] output=  myMD2.ComputeHash(input);

                    //string hashstr = GetHexStrByteArray(output);                  
                    return hashstr;

                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;        
                }
            }
        }
        /// <summary>
        /// 官方文档介绍为了hash后是需要核实后位十六进制字节数组,为了方便查看结果,格式化成2位十六禁止位的字符串
        /// https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.md5?view=netframework-4.8
        /// ComputeHash类的方法将 MD5 哈希值作为16字节的数组返回。 请注意,某些 MD5 实现产生了32字符的十六进制格式的哈希。
        /// 若要与此类实现进行互操作,请将方法的返回值格式化 ComputeHash 为十六进制值。
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static string GetHexStrByteArray(byte[] array)
        {
            string result = "";
            for (int i = 0; i < array.Length; i++)
            {
                //输出2位的十六进制
                result+=($"{array:x2}");                 
            }
            return result;
        }
    }
}
3.测试源代码下载及项目介绍 https://github.com/edzjx/Md2Crypto
参考引用
【1】MD2最初算法(C实现)The MD2 Message-Digest Algorithm
【2】52pojie提问帖 读书成诗-谜题求解2 第91楼
【3】Java 加密库官网 Apache Commons Codec
【4】参考网上的java MD2 demo Java MD2加密算法
【5】使用Mono加密库官网介绍 Cryptography
【6】参考CSharp Cryptography库使用代码(此网站可以搜索代码很方便)  C# (CSharp) Mono.Security.Cryptography MD2.ComputeHash Examples
【7】参考MSDN MD5官方文档 MD5 类 代码参考的 SHA256 类
【8】python3中digest()和hexdigest()区别
【9】 字符编码之ASCII、UTF-8、UTF-16的区别

免费评分

参与人数 4吾爱币 +19 热心值 +4 收起 理由
涛之雨 + 16 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
UniqueLegend + 1 + 1 我很赞同!
卡拉肖克倩 + 1 + 1 厉害了
yue_tai_mei + 1 + 1 膜拜大佬

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| edzjx 发表于 2020-11-16 21:00
Pojiedd 发表于 2020-11-12 20:39
这篇帖子只有开头是对的,python的代码咋会有main呢?另外所有代码有个细节都错了。

哪个细节?我可能没注意
gdlove 发表于 2020-11-26 14:53
就在今天公众号 给出提示:    各种泄露/引流/恰饭泛滥,渠道暂停~
各位以后如果有资源的话麻烦分享下
 楼主| edzjx 发表于 2020-11-5 16:12
另外,我的CPU 睿频2.0GHz 4C8T ,用dotnet计算执行2亿次循环大概1个半小时。
头像被屏蔽
小破孩9527 发表于 2020-11-5 23:47
提示: 作者被禁止或删除 内容自动屏蔽
asd3288 发表于 2020-11-6 09:04
感觉输出的数据都是一致的,是不是代码写错了。。。。另外修改后跑了两个小时算出来的结果还是错的
仍是少年j 发表于 2020-11-10 10:30
感谢大佬,我电脑还在计算中
仍是少年j 发表于 2020-11-10 10:57
仍是少年j 发表于 2020-11-10 10:30
感谢大佬,我电脑还在计算中

解密后的结果还是不对。。奇怪了
Pojiedd 发表于 2020-11-12 20:39
这篇帖子只有开头是对的,python的代码咋会有main呢?另外所有代码有个细节都错了。
 楼主| edzjx 发表于 2020-11-16 20:58
仍是少年j 发表于 2020-11-10 10:57
解密后的结果还是不对。。奇怪了

把你看到的题目和你写的代码贴出来。
UniqueLegend 发表于 2020-11-17 09:20
# md2加密1亿次
    for i in range(200000000):

这里要改一下100000000~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 04:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表