java md2_GitHub - edzjx/Md2Crypto

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

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

文章结构

破题

解体代码

项目代码说明

参考引用

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

解:

1.破题

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

5d02442262a9df52f71b0bac922d8131.png

上图是一个标准的钢琴键盘示意图。这句话的意思黑键也算,从第一个数中央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 类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java stringbuffer原理_深入理解Java:String

在讲解String之前&#xff0c;我们先了解一下Java的内存结构。一、Java内存模型按照官方的说法&#xff1a;Java 虚拟机具有一个堆&#xff0c;堆是运行时数据区域&#xff0c;所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存&#xff1a;堆和非堆&#xff0c;堆…

java dubbo jsf_cubelink

cubelink概要设计[TOC]1. 撰写记录更新时间内容作者2017-08-23 08:39:31撰写参数回调章节内容林斌2017-08-22 21:26:52增加了异步响应和异步回调章节林斌2017-08-22 14:36:36确定文档结构和大致框架林斌2. 设计目标设计一个具备治理&#xff0c;监控&#xff0c;服务发现能力的…

python 的案例实战_python案例实战之一

分析思路&#xff1a;1、明确分析目标&#xff1b;2、导入库、导入数据&#xff1b;3、简单查看下数据行列、整体情况&#xff1b;4、数据清洗&#xff1b;5、确定维度和指标&#xff1b;6、分析并作图1、查看整体数据情况1.1引入使用的库import numpy as npimport pandas as p…

java数据结构期末复习_java数据结构复习02

1.递归问题1.1计算阶乘packageinterview.recursion;importjava.util.Scanner;public classFact {public static voidmain(String[] args) {System.out.println("请输入n的值&#xff1a;");Scanner in newScanner(System.in);int n in.nextInt();int num fact(n);Sys…

java中methods方法_java中Class.getMethod方法

Method Class.getMethod(String name, Class>... parameterTypes)的作用是获得对象所声明的公开方法该方法的第一个参数name是要获得方法的名字&#xff0c;第二个参数parameterTypes是按声明顺序标识该方法形参类型。person.getClass().getMethod("Speak", null)…

centos6 yum快速安装mysql_centos6.10 yum安装mysql 5.6-Go语言中文社区

一、检查系统是否安装其他版本的MYSQL数据#yum list installed | grep mysql#yum -y remove 文件名二、安装及配置# wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm# rpm -ivh mysql-community-release-el6-5.noarch.rpm# yum repolist all | grep mysq…

二叉树两节点距离java,求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?

以往写cli下运行的业务或者测试代码&#xff0c;总是新建文件&#xff0c;面向过程编写代码。几次之后&#xff0c;cli目录下好多文件&#xff0c;即便勉强在一个cli测试文件中写了一个类&#xff0c;也是让其中的一个方法自启动&#xff0c;要测试别的方法&#xff0c;总是要修…

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决&#xff1f;,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决&#xff1f;易采站长站&#xff0c;站长之家为您整理了php gd库中文乱码怎么解决&#xff1f;的相关内容。解决方法&#xff1a;1、网站整站使用UTF8编码&#xff0c;如果已使用GB2312…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题&#xff1a;JS实现网站图片飘窗效果&#xff0c;JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果&#xff0c;Java悬浮广告&#xff0c;郑州SEO提供以下代码&#xff0c;仅供参考&#xff1a;飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库&#xff0c;包括数据类型&#xff0c;功能&#xff0c;架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包&#xff0c;默认PostgreSQL是没有的&#xff0c;需要安装orafce包来实现…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退&#xff0c;LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果)&#xff0c;VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…

kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...

为了解决Windows远程桌面访问Ubuntu 12.04 之一 中提到的VNC远程桌面的缺点(见http://www.linuxidc.com/Linux/2012-07/64801.htm)&#xff0c;我们采用第二种方法XRDP&#xff0c;该方法支持多用户登录并远程桌面。1、首先参考Windows远程桌面访问Ubuntu 12.04 之安装VNC中提到…

linux装redis环境变量,linux 怎样安装redis

人到中年有点甜获取Redis1、通过官网http://redis.io/获取稳定版源码包下载地址&#xff1b;2、通过wget http://download.redis.io/releases/redis-3.0.2.tar.gz下载 源码包&#xff1b;2编译安装Redis1、解压源码安装包&#xff0c;通过tar -xvf redis-3.0.2.tar.gz解压源码&…

word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符

word文件中有换行符很正常&#xff0c;但是想要将换行符全部替换为回车符&#xff0c;该怎么替换?以下是学习啦小编为您带来的关于word文章中的换行符批量替换为回车符&#xff0c;希望对您有所帮助。word文章中的换行符批量替换为回车符1、在打开的word中&#xff0c;依次点击…

linux禁用防火墙配置,CentOS Linux防火墙配置及关闭

最近在CentOS Linux下安装配置 Oracle 数据库的时候&#xff0c;总显示因为网络端口而导致的EM安装失败&#xff0c;遂打算先关闭一下防火墙。偶然看到防火墙的配置操作说明&#xff0c;感觉不错。执行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码&#xff1a;#include int main(){int n1;int m2;switch(n){case 1:m;case 2:n;case 3:switch(n){case 1:n;case 2:m;n;break;}case 4:m;break;default:break;}printf("%d %d",m,n);return 0;}代码看起来很简单&#xff0c…

linux dd 进度条,Progress 进度条 – DDProgressHUD

DDProgressHUDProgress 进度条&#xff0c;UIActivityIndicatorView 小菊花&#xff0c;弹窗&#xff0c;状态显示&#xff0c;高度自定义DDProgressHUD的介绍提供了四种类型的展示&#xff1a;显示无限旋转的加载图(比如小菊花&#xff0c;可以自定义)&#xff0c;显示文字信息…

Android动态图标包制作教程,安卓手机ico图标制作美化图文教程

如何让手机更加与众不同?今天我们就来学习如何利用出色的ico图标制作软件——Axialis IconWorkshop制作出美化手机屏幕的个性图标!如今&#xff0c;每个人都有属于自己的手机&#xff0c;每天使用手机聊QQ、刷微博、玩游戏&#xff0c;可以说手机已经是很多人生活中不可缺少的…

android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式

果&#xff1a;和之前的一样&#xff0c;在布局文件中&#xff1a;android:id"id/progressBar3"android:layout_width"wrap_content"android:layout_height"wrap_content"android:indeterminate"false"android:indeterminateDrawable&…