此项目来源一个字谜解体过程

一个程序猿在自己的微信公众号里出了一个字谜。其中用到了MD2加密算法,这是各很古老的加密算法。从网上搜到作者92年发布的C代码还能正常执行。此项目介绍解题过程,和使用C,C#,Java,Python3来测试代码。

文章结构

破题

解体代码

项目代码说明

参考引用

题目:黑白皆算,对我等众猿而言中央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.1Python

Python的代码最为简洁,我参考52pojie贴子:

from Crypto.Hash import MD2

if __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 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($"{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?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\[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_Java

IDE: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 类

java md2_GitHub - edzjx/Md2Crypto相关推荐

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

    题目:黑白皆算,对我等众猿而言中央C所在位置数优剃爱肤杠吧爱慕帝贰亿次的值是? 解: 1.破题 1.1黑白皆算,中央C所在位置(C do) 上图是一个标准的钢琴键盘示意图.这句话的意思黑键也算,从第一 ...

  2. java的byte与C#的异同引起的字符处理问题。

    java的byte是有符号类型(java就没有无符号类型的数据),值域:-0128~127 c#的byte是无符号类型数值,值域:0~255 这在依赖字符编码处理程序中,两者源代码就不能通用了. 知道 ...

  3. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  4. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  5. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  6. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  7. SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

    SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...

  8. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

  9. Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid

    Gradle错误提示:Java home supplied via 'org.gradle.java.home' is invalid 描述:在使用idea采用gradle进行依赖的管理功能,当想切换 ...

最新文章

  1. 【HTML+CSS练习】画一个条件查询
  2. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
  3. 当推荐系统遇上用户画像:你的画像是怎么来的?
  4. java中setDocument_Java ActionItem.setDocumentId方法代码示例
  5. 水平分库分表的关键问题及解决思路(转)
  6. 统一的Ajax提交封装,一劳永逸好工具(带跨域处理)
  7. 英特尔中国:截至2018年底女性员工占比33%
  8. layUI数据表格可编辑扩展下拉框
  9. springboot内置浏览器_springboot-为内置tomcat设置虚拟目录
  10. 【转】数字图像处理课件-艾海舟
  11. 微软ewf不还原注册表_Microsoft大胆计划将功能区还原回工具栏
  12. 新冠能否开启物联网发展的大门
  13. 软件工程基础知识--需求分析
  14. Oracle 创建表详解(create table)
  15. (转)Weblogic 8.1的安装与配置
  16. 看一个师兄的操作系统视频有感
  17. win7安装php失败,win7升win10安装失败怎么办
  18. 我在阿里三年的运营经都在这儿了
  19. OMRON NJ501-1520真实项目程序 欧姆龙NJ做的程序27轴+110个气缸+1个机械手
  20. SQL语句报错:1062, “Duplicate entry ‘XXX‘ for key ‘XXX‘

热门文章

  1. js滚动,滑动,幻灯片,轮播,swipe js滚动,滑动,幻灯片,轮播
  2. 台式机计算机怎么分割,编辑手把手教程 如何给电脑硬盘分区
  3. @PostConstruct注解详解
  4. rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)
  5. 关键词热度分析工具_谷歌SEO推广排名的关键要素(一)利用谷歌关键词分析工具分析关键词...
  6. 怎样用c语言统计字符个数字,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  7. python 引入同一路径的类_Python入门 模块导入 import ...\from... import...
  8. 李秀计算机文化基础,计算机文化基础(李秀)绪论.pptx
  9. win8 mysql6_Win8系统 MySQL 6.0 安装图解
  10. 设 l í {a,b,c}* 是满足下述条件的符号串构成的语言,编译原理模拟试题1和2的答案...