建设门户网站需要注意什么意思,江津哪个网站可以做顺风车,网站建设哪家go好,全国装修公司排名100强此项目来源一个字谜解体过程一个程序猿在自己的微信公众号里出了一个字谜。其中用到了MD2加密算法#xff0c;这是各很古老的加密算法。从网上搜到作者92年发布的C代码还能正常执行。此项目介绍解题过程#xff0c;和使用C#xff0c;C#,Java,Python3来测试代码。文章结构破…此项目来源一个字谜解体过程一个程序猿在自己的微信公众号里出了一个字谜。其中用到了MD2加密算法这是各很古老的加密算法。从网上搜到作者92年发布的C代码还能正常执行。此项目介绍解题过程和使用CC#,Java,Python3来测试代码。文章结构破题解体代码项目代码说明参考引用题目黑白皆算对我等众猿而言中央C所在位置数优剃爱肤杠吧爱慕帝贰亿次的值是解1.破题1.1黑白皆算中央C所在位置(C do)上图是一个标准的钢琴键盘示意图。这句话的意思黑键也算从第一个数中央C是第40个(每组12按键(7个白键5个黑键第一组前有3个按键)。1.2 对我等众猿而言意思是从0开始索引那么C do的位置值是391.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的代码最为简洁我参考52pojie贴子from Crypto.Hash import MD2if __name__ __main__:#print_hi(PyCharm)txt 39# md2加密2亿次 根据实际题目修改此处的for i in range(200000000):txt MD2.new(txt.encode(utf8)).hexdigest()print(txt)需要Python环境安装pycryptodome ,使用pip安装 pip install pycryptodome。hexdigest()作为十六进制数据字符串值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 根据题目在是1亿还是2亿进行修改for(int i0;i200000000;i){/// public static byte\[\] md2(String data) {// return md2(StringUtils.getBytesUtf8(data));// }txt DigestUtils.md2Hex(txt);}System.out.println(txt);}}2.3CSharpC#的代码最为麻烦首先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(${i:d9}:{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?viewnetframework-4.8/// ComputeHash类的方法将 MD5 哈希值作为16字节的数组返回。 请注意某些 MD5 实现产生了32字符的十六进制格式的哈希。/// 若要与此类实现进行互操作请将方法的返回值格式化 ComputeHash 为十六进制值。/// /summary/// param namearray/param/// returns/returnspublic static string GetHexStrByteArray(byte\[\] array){string result ;for (int i 0; i array.Length; i){//输出2位的十六进制result(${array\[i\]:x2});}return result;}}}3.测试代码项目说明3.1 MD2Hash_C环境:IDE:CLion构建CMake(3.17)编译器MSVC14.27目录src *#C源码目录 *----md2.c #md2算法实现----mddriver.c #测试代码Main()在此文件在include #头文件目录----global.h #全局配置文件----md2.h #md2.c头文件3.2 demo_py3环境IDE:pycharm 或者visual studio 2019构建IDE内置py3环境vs2019自带python环境 py3.7 x64目录main.py #测试源代码3.3 demo_JavaIDE:IDEA构建IDE内置Java环境java1.8目录lib 第三方库目录----commons-codec-1.15.java #引用的MD2加密算法库src 源代码文件----com.company.Main #测试源代码3.4 demo_c#IDE:Rider 或者 visual studio 2019构建IDE内置Dotnet环境netcore3.1目录testdemo----Program.cs #测试源代码参考引用【4】参考网上的java MD2 demo Java MD2加密算法【5】使用Mono加密库官网介绍 Cryptography【7】参考MSDN MD5官方文档 MD5 类 代码参考的 SHA256 类