在 Python 2.7 中复制 Java 的 PBEWithMD5AndDES

2024-01-03

如果这不是很明显,我首先要说的是我不是加密货币人士。

我的任务是在 Python 2.7 中复制 Java 的 PBEWithMD5AndDES(具有 DES 加密的 MD5 摘要)的行为。

我确实可以访问 Python 的加密工具包 PyCrypto。

下面是我试图复制其行为的 Java 代码:

import java.security.spec.KeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.Cipher;
import javax.xml.bind.DatatypeConverter;

public class EncryptInJava
{
    public static void main(String[] args)
    {
      String encryptionPassword = "q1w2e3r4t5y6";
      byte[] salt = { -128, 64, -32, 16, -8, 4, -2, 1 };
      int iterations = 50;

      try
      {
        KeySpec keySpec = new PBEKeySpec(encryptionPassword.toCharArray(), salt, iterations);
        SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
        AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterations);

        Cipher encoder = Cipher.getInstance(key.getAlgorithm());
        encoder.init(Cipher.ENCRYPT_MODE, key, paramSpec);

        String str_to_encrypt = "MyP455w0rd";
        byte[] enc = encoder.doFinal(str_to_encrypt.getBytes("UTF8"));

        System.out.println("encrypted = " + DatatypeConverter.printBase64Binary(enc));
      }
      catch (Exception e)
      {
        e.printStackTrace();
      }
    }
}

对于给定值,它输出以下内容:

encrypted = Icy6sAP7adLgRoXNYe9N8A==

这是我将上面的内容移植到 Python 的笨手笨脚的尝试,encrypt_in_python.py:

from Crypto.Hash import MD5
from Crypto.Cipher import DES

_password = 'q1w2e3r4t5y6'
_salt = '\x80\x40\xe0\x10\xf8\x04\xfe\x01'
_iterations = 50
plaintext_to_encrypt = 'MyP455w0rd'

if "__main__" == __name__:

    """Mimic Java's PBEWithMD5AndDES algorithm to produce a DES key"""
    hasher = MD5.new()
    hasher.update(_password)
    hasher.update(_salt)
    result = hasher.digest()

    for i in range(1, _iterations):
        hasher = MD5.new()
        hasher.update(result)
        result = hasher.digest()

    key = result[:8]

    encoder = DES.new(key)
    encrypted = encoder.encrypt(plaintext_to_encrypt + ' ' * (8 - (len(plaintext_to_encrypt) % 8)))
    print encrypted.encode('base64')

它输出一个完全不同的字符串。

是否可以使用标准 Python 库将 Java 实现移植到 Python 实现?

显然,Python 实现要求我加密的明文是八个字符的倍数,而且我什至不确定如何填充我的明文输入以满足该条件。

感谢您的帮助。


对于 Python 3.6,我使用以下代码进行了测试,它与上面的代码进行了一些更改:

from Crypto.Hash import MD5
from Crypto.Cipher import DES
import base64
import re

_password = b'q1w2e3r4t5y6'
_salt = b'\x80\x40\xe0\x10\xf8\x04\xfe\x01'

_iterations = 50

plaintext_to_encrypt = 'MyP455w0rd'

# Pad plaintext per RFC 2898 Section 6.1
padding = 8 - len(plaintext_to_encrypt) % 8
plaintext_to_encrypt += chr(padding) * padding

if "__main__" == __name__:

    """Mimic Java's PBEWithMD5AndDES algorithm to produce a DES key"""
    hasher = MD5.new()
    hasher.update(_password)
    hasher.update(_salt)
    result = hasher.digest()

    for i in range(1, _iterations):
        hasher = MD5.new()
        hasher.update(result)
        result = hasher.digest()

    encoder = DES.new(result[:8], DES.MODE_CBC, result[8:16])
    encrypted = encoder.encrypt(plaintext_to_encrypt)

    print (str(base64.b64encode(encrypted),'utf-8'))

    decoder = DES.new(result[:8], DES.MODE_CBC, result[8:])
    d = str(decoder.decrypt(encrypted),'utf-8')
    print (re.sub(r'[\x01-\x08]','',d))

Output:

Icy6sAP7adLgRoXNYe9N8A==

MyP455w0rd

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 2.7 中复制 Java 的 PBEWithMD5AndDES 的相关文章

随机推荐

  • C++11 中的 C 风格回调

    在 C 11 项目中 我使用需要 C 风格回调的 C 风格第三方库 在我的例子中为curl 为了实现这一点 我使用了 指向成员的指针 运算符 size t c callback wrapper char ptr size t size si
  • onClick 不起作用

    我想使用 JS 将表格行转换为链接 我的它看起来像这样 tr 但是 当我尝试单击时 它并没有按照我想要的方式进入页面 事实上 点击似乎没有任何动作 有什么帮助吗 Edit 至于引用 我忘了提及我是用 PHP 来回应这一点的 这是我更新的代码
  • 外键引用同一个表

    有一次面试测试 下面是表格和结构 Table Person id name dob dod mother id father id Primary Key id Foreign Key mother id references Person
  • 在 Electron 应用程序中导航 Angular 路线时出现空白屏幕

    我目前正在使用 Electron 编写一个桌面混合应用程序 并与 AngularJS 集成进行路由等 请参阅以下角度配置 app config function routeProvider locationProvider routePro
  • 在 C# 中解析 SQL 字符串

    我需要解析一个Command CommandText 我不想运行查询 我只想看看如果执行命令 查询是否会成功 说我有 SELECT FROM SomeTable WHERE 1 1 该字符串将会成功 but SELECT FROM Some
  • 如何知道用户何时离开页面并刷新页面

    我想在用户离开页面之前进行 AJAX 调用 基本上是在离开页面之前和刷新页面之前 如何才能做到这一点 我试图用 jQuery 搜索一些东西 但没有得到任何结果 我尝试使用以下代码 window onbeforeunload function
  • mysql 查询是否可以返回 true/false 而不是值?

    我有一张桌子 custID orderID orderComponent 1 123 pizza 1 123 wings 1 234 breadsticks 1 239 salad 2 456 pizza 2 890 salad 我有一个值
  • 在构建情况下验证所属关联

    我有一个任务模型 它有很多任务 并且任务属于任务 为了安全起见 我对任务模型进行了验证 validates presence of mission id validates numericality of mission id 但问题是 当
  • IPFS:如何将文件添加到现有文件夹?

    给定一个相当大的文件夹 它已经被推送到网络 并在本地删除 如何将文件添加到该文件夹 而不重新下载整个文件夹 你只能通过使用来做到这一点ipns再次下载后ipfs get 如果它仍然固定到本地存储 那么应该会很快 1 首先将您的文件夹递归添加
  • 为什么 `vector v{{5,6}};` 有效?我以为只允许使用一对 {}?

    给定一个类A有两个构造函数 取initializer list
  • 在 C++ 中使用 SSE 将两个 32 位整数向量相乘的最快方法

    我有两个无符号向量 大小均为 4 vector
  • EPPlus 依赖循环

    从 PowerShell 安装 EPPlus 时 我得到以下信息 所有命令都是第一次运行 PackageSource Get PackageSource Name PSGallery if PackageSource IsTrusted S
  • 如何在 django 视图中将一个页面重定向到另一个页面时延迟 5 秒

    我使用了这段代码 但我想要的延迟没有实现 我希望它在那里停留至少 5 秒 from django http import HttpResponseRedirect def myview request return HttpResponse
  • mysqli_real_escape_string 安全吗?

    我是 PHP 新手 我意识到使用 php 表单 带有用户和传递文本输入 的数据库连接是完全不安全的 这是可行的 但不安全 所以 我读过有关 mysqli real escape string 的内容 并决定尝试一下
  • laravel 5.4 MIME 自定义错误消息不起作用?

    Dearest 我想为上传的图像制作自定义错误消息 这是我的控制器代码 protected function validator data validateContent messages imgUserAvatar mimes gt Fi
  • Riverpod:摄取 REST API 的简单方法

    我目前正在构建一个应用程序 该应用程序摄取 WordPress REST API 来显示博客文章 在初始应用程序加载时 我希望它使用一种方法提取初始数据 然后通过用户交互提取更多帖子 我目前正在进行这项工作 但是 我的实现似乎很复杂 并且可
  • 如何计算 PySpark 中行之间的差异?

    这是我在 PySpark 中的数据框 utc timestamp data feed 2015 10 13 11 00 00 00 00 1 A 2015 10 13 12 00 00 00 00 5 A 2015 10 13 13 00
  • OpenShift 中水平 pod 自动缩放器的自定义指标

    我正在使用 openshift v3 它使用 kubernetes 版本 1 2 我正在探索更多有关自动缩放功能的信息 目前它表示仅支持 CPU 指标 有没有一种方法可以根据内存或从 heapster 收集的其他指标数据来扩展 opensh
  • 如何等待ajax请求?

    我正在尝试编写一个 JS 代码 如果给定的数字已存在于数据库中 该代码将取消 btn submit 按钮 onclick 事件 我使用 AJAX 查询数据库中的给定数字 并确定是否应将数据发送到将上传问题的 php 站点 为了确定这一点 我
  • 在 Python 2.7 中复制 Java 的 PBEWithMD5AndDES

    如果这不是很明显 我首先要说的是我不是加密货币人士 我的任务是在 Python 2 7 中复制 Java 的 PBEWithMD5AndDES 具有 DES 加密的 MD5 摘要 的行为 我确实可以访问 Python 的加密工具包 PyCr