基于John Carmark密码详解

基于John Carmack密码详解

什么是John Carmack密码?

John Carmack密码,也称为“DooM3密码”,是由游戏开发者John Carmack在2004年所创造的密码。这种密码的特点在于:使用了MD5哈希加密算法,并且还有一些特殊的操作。

John Carmack密码的组成

John Carmack密码由以下几个部分组成:

  • 一个固定的“seed”,即种子。
  • 一个是MD5哈希值。
  • 一个简单的运算,主要是整数除法和模运算。

John Carmack密码的详细过程

  1. 首先,输入需要加密的字符串,获得一个MD5哈希值。
  2. 将哈希值分为四等份,每份32位,共128位。
  3. 将其中任意两份相加,得到一个新的32位数。
  4. 使用这个新数对种子进行整数除法,得到一个商和余数。
  5. 将商和余数进行拼接,得到一个6位数。
  6. 对这个6位数进行模运算,得到一个0至9的数字。
  7. 将该数字连接到上一个步骤中拼接的结果中,使其变成7位数。
  8. 重复步骤4~7,使7位数变得相当长。
  9. 将上一个步骤中得到的数进行最后一次模运算,得到一个0至25的数字。
  10. 将数字转化为字母,得到加密后的结果。

John Carmack密码示例

示例1

考虑将“hello”字符串加密,假设种子为123456。

我们首先需要计算“hello”的MD5哈希值:

5d41402abc4b2a76b9719d911017c592

将这个哈希值分为四等份:

5d41402a
bc4b2a76
b9719d91
1017c592

对任意两份相加,得到新数:

5d41402abc4b2a76b9719d911017c592
    +    +
b9719d911017c5925d41402abc4b2a76
    +    +
1017c5925d41402abc4b2a76b9719d91
    +    +
bc4b2a765d41402a1017c592b9719d91

我们使用种子123456对新数进行整数除法:

5d41402abc4b2a76b9719d911017c592
    +    +
b9719d911017c5925d41402abc4b2a76
    +    +
1017c5925d41402abc4b2a76b9719d91
    +    +
bc4b2a765d41402a1017c592b9719d91

/ 123456

= 66582743160302832
   64175153007267852
   57615207159820918
   76846141473304548

将商和余数进行拼接,得到6位数:

66582743160302832641751530072678525761520715982091876846141473304548

对这个6位数进行模运算,得到数字2。

将数字2连接到前一个结果中,得到7位数:

665827431603028326417515300726785257615207159820918768461414733045482
2

重复此步骤,得到加密后的结果:

6658274316030283264175153007267852576152071598209187684614147330454822
7

将数字转换为字母,得到最终结果:

bbadbba

所以,字符串“hello”经过John Carmack密码加密后得到的结果为“bbadbba”。

示例2

再考虑一个简单的例子,将字符串“abc”加密。

首先,对“abc”进行MD5哈希,得到:

900150983cd24fb0d6963f7d28e17f72

将哈希值分为四等份,得到:

90015098
3cd24fb0
d6963f7d
28e17f72

对任意两份相加,得到新数:

900150983cd24fb0d6963f7d28e17f72
    +    +
3cd24fb028e17f7290015098d6963f7d
    +    +
d6963f7d900150983cd24fb028e17f72
    +    +
28e17f7290015098d6963f7dd6963f7d

使用种子654321进行整数除法,得到:

900150983cd24fb0d6963f7d28e17f72
    +    +
3cd24fb028e17f7290015098d6963f7d
    +    +
d6963f7d900150983cd24fb028e17f72
    +    +
28e17f7290015098d6963f7dd6963f7d

/ 654321

= 137578816505297
   137400959170426
   276369287834146
   345920829105210

将商和余数拼接,得到:

137578816505297137400959170426276369287834146345920829105210

对这个6位数进行模运算,得到数字3。

将数字3连接到上一步的结果中,得到:

1375788165052971374009591704262763692878341463459208291052103

重复此步骤,得到:

13757881650529713740095917042627636928783414634592082910521036
2

将数字转化为字母,得到最终结果:

sibsirs

因此,字符串“abc”经过John Carmack密码加密后得到的结果为“sibsirs”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于John Carmark密码详解 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#使用MSTest进行单元测试

    C#作为一门强类型语言,其灵活的语法和强大的功能已成为许多程序员首选的开发语言。在软件开发过程中,单元测试起到非常重要的作用,能够在最小的范围内对代码进行测试和验证,从而提高代码的质量和可靠性。MSTest是C#开发中广泛使用的单元测试框架之一,本文将详细介绍使用MSTest进行C#单元测试的完整攻略。 安装MSTest框架 MSTest是Visual St…

    C# 2023年5月15日
    00
  • C# Path.GetFileName(string path):获取指定路径的文件名(包括扩展名)

    Path.GetFileName(string path)方法用于获取指定路径中的文件名和扩展名。它返回带有文件扩展名的文件名的字符串。 使用方法: 引用System.IO命名空间。 using System.IO; 调用Path.GetFileName方法,并传入路径字符串作为参数。 string fileName = Path.GetFileName(&…

    C# 2023年4月19日
    00
  • C# 代码大小写规范说明

    下面是关于“C# 代码大小写规范说明”的详细攻略。 一、概述 在编写C#代码时,遵守严格的大小写规范是很重要的。正确使用大小写不仅有助于提高代码的可读性,还能减少在编译时出现的错误。 在制定C#代码大小写规范时,应该遵循以下一般原则: 符号和关键字应该全部使用小写字母; 类和命名空间应该以大写字母开头,其余部分全部使用小写字母; 方法和变量名应该以小写字母开…

    C# 2023年6月6日
    00
  • C#统计字符串里中文汉字个数的方法

    下面我将详细讲解“C#统计字符串里中文汉字个数的方法”的完整攻略。 1. 确定需求和情景 在开发过程中,我们需要先确定需求和情景。经过分析,我们的需求是:编写一段 C# 代码,统计给定字符串里汉字的个数。情景是:我们需要在一个网站中统计每个评论中汉字的个数,以便进行敏感信息监控。 2. 了解中文汉字的编码 在编写代码前,需要了解中文汉字的编码情况。中文汉字采…

    C# 2023年6月8日
    00
  • c# 成员类型访问权限低于字段本身的实现

    首先,需要理解C#语言中成员类型的访问权限。 C#语言给成员类型(包括类、结构体、枚举、接口等)能够设置访问权限,同样也允许字段有访问权限。成员类型的访问权限指的是该类型能够被哪些程序集中的代码访问。字段的访问权限指的是该字段能够被定义它的类型或其他类型的代码访问。 针对问题中的情况,既然成员类型的访问权限低于字段本身,那么我们可以通过某种方式绕过成员类型的…

    C# 2023年5月15日
    00
  • C# 基础入门–关键字

    C# 基础入门–关键字 本篇文章将详细讲解C#中的关键字,包括其含义、使用方法以及示例说明。 什么是关键字 在C#中,关键字是一些特殊的单词,具有特定的含义和用途。这些关键字在程序中有特殊的语法和语义,不能被用作标识符或其他用途。 常用关键字 1. public public关键字表示公共的访问级别,用于修饰类、方法、属性和字段。使用public修饰的成员…

    C# 2023年6月7日
    00
  • C#中通过反射将枚举元素加载到ComboBo的实现方法

    C#中通过反射将枚举元素加载到ComboBox的实现方法可以分为以下步骤: 1. 获取枚举类型 首先需要获取对应枚举类型,可以使用typeof关键字获取: Type enumType = typeof(MyEnumType); 也可以使用GetType方法获取: MyEnumType obj = new MyEnumType(); Type enumType…

    C# 2023年6月3日
    00
  • C# 多网卡 Server Listen

    当服务器有多个网卡时,我们需要指定所有网卡进行监听,以确保能够接收所有连接请求。下面是实现 C# 多网卡 Server Listen 的完整攻略。 第一步:获取本机所有 IP 地址 在 C# 中,可以使用 Dns.GetHostAddresses() 方法获取本机所有的 IP 地址,代码如下: var hostName = Dns.GetHostName()…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部