基于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#去除DataTable重复数据的三种方法

    标题:C#去除DataTable重复数据的三种方法 方法一:使用Linq去重 步骤: 1.将DataTable转换为IEnumerable对象; 2.使用Linq的Distinct方法去重; 3.将结果转换为DataTable对象。 示例: DataTable table = new DataTable(); // 假设table中包含重复数据 IEnume…

    C# 2023年6月2日
    00
  • C#图像识别 微信跳一跳机器人

    下面是我对“C#图像识别微信跳一跳机器人”的攻略讲解: 一、前置知识 在开始攻略之前,我们需要掌握以下基本知识: C#编程语言基础 图像识别技术 微信跳一跳游戏的规则和机制 二、步骤 步骤一:获取游戏中的截图 要进行图像识别,首先需要获取游戏中的截图。这可以通过Windows API来完成。具体来说,我们可以使用Windows API中的“BitBlt”方法…

    C# 2023年5月14日
    00
  • 详解WPF如何使用必应地图控件

    详解WPF如何使用必应地图控件 Bing Maps是由微软公司开发的一款Web地图服务,拥有强大的地图绘制和查询功能。它提供了丰富的API和插件,以便为开发者提供全球范围内的地图数据和地图功能。 在WPF项目中,可以使用必应地图控件来在应用程序中嵌入Bing Maps地图。该控件允许您将地图视图嵌入到WPF应用程序中,并提供交互性和属性设置选项。 步骤一:安…

    C# 2023年6月6日
    00
  • C#双向链表LinkedList排序实现方法

    下面将为你详细讲解如何实现C#双向链表LinkedList排序的方法。 C#双向链表LinkedList排序实现方法 1. LinkedList简介 Linked List又称链表,是一种常见的数据结构,其中的每个节点除了保存自己的数据外,还保存了指向下一个节点的指针。与数组不同,链表中的数据并不是连续存储的,所以可以动态地添加和删除节点,但是查找一个节点可…

    C# 2023年6月7日
    00
  • C# 没有动态的数组,可以用arraylist或list取代

    首先,需要说明的是C#中的数组属于静态数组,即在声明数组时就必须确定数组的长度,而不能在程序运行时再动态更改数组的大小。但是,C#提供了一些其他的数据结构,例如ArrayList和List,可以实现动态数组的功能。下面是使用ArrayList和List的具体说明: 使用ArrayList ArrayList是可以动态调整存储数据的容器,通过Add方法可以向其…

    C# 2023年6月7日
    00
  • ASP.NET Core中间件计算Http请求时间示例详解

    在ASP.NET Core中,中间件是一种非常强大的机制,可以用于处理HTTP请求和响应。在本攻略中,我们将介绍如何编写一个中间件来计算HTTP请求的时间,并将其记录到日志中。 步骤一:创建ASP.NET Core应用程序 首先,需要创建一个ASP.NET Core应用程序。可以使用以下命令在命令行中创建一个新的ASP.NET Core Web应用程序: d…

    C# 2023年5月17日
    00
  • 解析C#中不一样的大小写转换

    针对“解析C#中不一样的大小写转换”这一话题,我来给出一份完整攻略。 什么是大小写转换 大小写转换是指将一个字符串中的所有字母(或指定位置的字母)由一个状态(大写或小写)转成另一个状态(小写或大写)的操作。在 C# 中,字符串大小写转换一般用于进行字符串比较,或者对输出结果进行格式化等操作。 C# 中的大小写转换 C# 中提供了多种方法用于字符串大小写转换。…

    C# 2023年6月7日
    00
  • Unity3D UI Text得分数字增加的实例代码

    下面我将为您详细讲解“Unity3D UI Text得分数字增加的实例代码”的完整攻略。在这个过程中,我会提供至少两条示例说明。 首先,我们需要明确这个实例代码的目的是什么,即在游戏中实时更新得分数字。在 Unity 中,我们可以使用 UI Text 组件来显示游戏界面上的得分数字。因此,我们需要对 UI Text 组件进行设置,以实现数字的增加效果。 接下…

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