.Net 和 PHP Rijndael 加密不匹配

2023-12-22

起初我以为这是填充,因为 mcrypt 使用零填充,但我更改了 php 以使用 PKCS7 并得到了相同的精确结果

有人可以帮忙吗?我认为这与php中的填充有关

.Net 的测试输出:

Key: d88f92e4fa27f6d45b49446c7fc76976
Text: Testing123
Encrypted: /DMkj7BL9Eu2LMxKhdGT+A==
Encrypted after base64 decode: ?3$??K?K?,?J???
Decrypted: Testing123

测试 PHP 的输出:

Key: d88f92e4fa27f6d45b49446c7fc76976
Text: Testing123
Encrypted: K+ke5FNI5T6F6B/XvDF494+S8538Ze83cFz6v1FE89U=
Encrypted after base64 decode: +éäSHå>…è×¼1x÷’óüeï7p\ú¿QDóÕ
Decrypted: Testing123����������������������

PHP:

class rijndael{
var $mcrypt_cipher = MCRYPT_RIJNDAEL_256;
var $mcrypt_mode = MCRYPT_MODE_CBC;
function decrypt($pass, $encrypted)
{
    $encrypted = base64_decode($encrypted);
    $key = $this->getkey($pass);
    $iv = $this->getiv($pass);
    $decrypted = mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv);

    $block = mcrypt_get_block_size($this->mcrypt_cipher, $this->mcrypt_mode);
    $pad = ord($decrypted[($len = strlen($decrypted)) - 1]);
    return substr($decrypted, 0, strlen($decrypted) - $pad);

}
function encrypt($pass, $decrypted)
{
    $key = $this->getkey($pass);
    $iv = $this->getiv($pass);
    $block = mcrypt_get_block_size($this->mcrypt_cipher, $this->mcrypt_mode);
    $pad = $block - (strlen($str) % $block);
    $str .= str_repeat(chr($pad), $pad);
    $encrypted = mcrypt_encrypt($this->mcrypt_cipher, $key, $decrypted, $this->mcrypt_mode, $iv);
    return base64_encode($encrypted);
}
function getkey($passphrase)
{
    $L1 = base64_encode(hash("sha256", $passphrase, true));
    $L2 = $passphrase.$L1;
    return hash("sha256", $L2, true);
}
function getiv($passphrase)
{
    $L1 = base64_encode(md5($passphrase));
    $L2 = $passphrase.$L1;
    return md5($L2);
}
}

VB .Net:

Public Class RijnDael

    Public Shared Function Decrypt(ByVal sData As String, ByVal sKey As String)
        Dim bytData() As Byte = Encoding.UTF8.GetBytes(sData)
        Return Decrypt(bytData, sKey)
    End Function
    Public Shared Function Decrypt(ByVal bytData As Byte(), ByVal strPass As String) As Byte()
        Dim bytResult As Byte()
        Using oRM As New System.Security.Cryptography.RijndaelManaged
            oRM.KeySize = 256
            oRM.Key = GeKey(strPass)
            oRM.IV = GetIV(strPass)
            oRM.Mode = CipherMode.CBC
            oRM.Padding = PaddingMode.PKCS7
            Using oMS As New MemoryStream(bytData)
                Using oCS As New Cryptography.CryptoStream(oMS, oRM.CreateDecryptor, Security.Cryptography.CryptoStreamMode.Read)
                    Dim TempDecryptArr As Byte()
                    ReDim TempDecryptArr(bytData.Length)
                    Dim decryptedByteCount As Integer
                    decryptedByteCount = oCS.Read(TempDecryptArr, 0, bytData.Length)
                    '
                    ReDim bytResult(decryptedByteCount)
                    Array.Copy(TempDecryptArr, bytResult, decryptedByteCount)
                    '
                    oCS.Close()
                End Using
                oMS.Close()
            End Using
        End Using
        Return bytResult
    End Function

    Public Shared Function Encrypt(ByVal sData As String, ByVal sKey As String)
        Dim bytData() As Byte = Encoding.UTF8.GetBytes(sData)
        Return Encrypt(bytData, sKey)
    End Function
    Public Shared Function Encrypt(ByVal bytData As Byte(), ByVal strPass As String) As Byte()
        Dim bytResult As Byte()
        Using oRM As New Cryptography.RijndaelManaged
            oRM.KeySize = 256
            oRM.Key = GeKey(strPass)
            oRM.IV = GetIV(strPass)
            oRM.Mode = CipherMode.CBC
            oRM.Padding = PaddingMode.PKCS7
            Using oMS As New MemoryStream
                Using oCS As New Cryptography.CryptoStream(oMS, oRM.CreateEncryptor, Cryptography.CryptoStreamMode.Write)
                    oCS.Write(bytData, 0, bytData.Length)
                    oCS.FlushFinalBlock()
                    bytResult = oMS.ToArray()
                    oCS.Close()
                End Using
                oMS.Close()
            End Using
        End Using
        Return bytResult
    End Function

    Private Shared Function GeKey(ByVal strPass As String) As Byte()
        Dim bytResult As Byte()
        'Generate a byte array of required length as the encryption key.
        'A SHA256 hash of the passphrase has just the required length. It is used twice in a manner of self-salting.
        Using oSHA256 As New Cryptography.SHA256Managed
            Dim L1 As String = System.Convert.ToBase64String(oSHA256.ComputeHash(Encoding.UTF8.GetBytes(strPass)))
            Dim L2 As String = strPass & L1
            bytResult = oSHA256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(L2))
            oSHA256.Clear()
        End Using
        Return bytResult
    End Function

    Private Shared Function GetIV(ByVal strPass As String) As Byte()
        Dim bytResult As Byte()
        'Generate a byte array of required length as the iv.
        'A MD5 hash of the passphrase has just the required length. It is used twice in a manner of self-salting.
        Using oMD5 As New Cryptography.MD5CryptoServiceProvider
            Dim L1 As String = System.Convert.ToBase64String(oMD5.ComputeHash(Encoding.UTF8.GetBytes(strPass)))
            Dim L2 As String = strPass & L1
            bytResult = oMD5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(L2))
            oMD5.Clear()
        End Using
        Return bytResult
    End Function

End Class

您的两段代码中的问题是:

  • Use Rijndael-128.NET 和 PHP 代码中的密钥和块大小均为 16 字节/128 位。对于 Rijndael-256,您的代码生成长度错误的 IV。而且我不知道如何在 PHP 中使用 AES-256(密钥长度为 32 字节/256 位,块大小为 16 字节/128 位)。

  • MD5的使用: 在PHP代码中,添加第二个参数true to the md5()函数(在两个地方),因此结果是二进制数据而不是十六进制字符串。

  • 在 PHP 代码的 encrypt() 函数中,替换变量$str with $decrypted(在两个地方)。$str从未被赋值且从未被使用,因此填充没有效果。

如果解决这些问题,那么两个程序都会返回结果:

Encrypted: /DMkj7BL9Eu2LMxKhdGT+A==

我没有尝试解密它。

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

.Net 和 PHP Rijndael 加密不匹配 的相关文章

随机推荐

  • 如何使用 matplotlib 为烛台的灯芯部分着色?

    我正在寻找使用 matplotlib 将烛台的灯芯部分变成黑色 我在文档中找不到任何提及它的内容 但我已经看到图片示例表明它可以完成 这是我目前拥有的 这是灯芯被涂成黑色的示例 Update 我使用了下面提供的解决方案 但稍微更改了代码以删
  • 将 iOS (iPhone) 应用程序移植到 Mac?

    有没有首选的方法来解决这个问题 有问题的应用程序不太大 我花了几个月的时间编写的单人游戏 编辑 我应该补充一点 我没有 mac 开发经验 除了作为一名 iOS 开发人员自然而然的事情之外 编辑 游戏中大量使用的类 NSObject UIVi
  • 为注释字段设置默认空值时出错

    为什么我收到错误 属性值必须是常量 不是null持续的 Target ElementType TYPE Retention RetentionPolicy RUNTIME public interface SomeInterface Cla
  • 尝试从 matlab 调用 dll 函数导致崩溃

    我尝试在 MATLAB 中使用第三方外部 DLL 来自 usbmicro 但它总是使 MATLAB 崩溃 这是来自说明 C 程序中函数调用语法的文档 int USBm About char about 我尝试了这个 MATLAB 脚本 是的
  • 如何在受限服务器上安装 Perl 模块?

    我有一个可以通过 ssh 连接的服务器 但仅此而已 否则它就完全与外界隔绝了 我正在尝试部署一些我编写的脚本 但它们有几个 Perl 依赖项 Params Validate XML Simple 等 我无法通过 yum 获取它们 因为我们的
  • preStart 钩子:给 actor 本身的消息

    假设我覆盖了preStart挂接并发送消息至self Class SomeActor extends Actor override def preStart Unit self SomeMessage 我可以期待吗SomeMessage将是
  • Android:TabLayout 不工作

    我正在尝试官方开发人员网站上的 TabLayout 教程 我没有复制粘贴它 也没有对其中的拼写错误进行一些细微的更改和更正 package com org example import android app TabActivity imp
  • 将希腊字符添加到轴标题

    我想在 R 中的条形图的 y 轴上添加一个希腊字符 问题是我需要将这个角色整合到标题中 我想写 Diameter of aperture mu m 在轴标签中 With ylab expression 我可以写希腊字符 ylab axis
  • 如何在类组件中使用useMediaQuery

    当使用函数作为组件时 您可以使用useMediaQuery来自 Material ui 的钩子 然而 它没有向您展示如何在类中使用这个钩子 所以我做了一些研究 发现你可以通过这样做在课堂上使用它 import React from reac
  • python 将字符串转换为参数列表

    我可以在 python 中将字符串转换为参数列表吗 def func args for a in args print a args a func a 2 b 3 I want the following work like above c
  • 如何使用 PHP 确定文件年龄?

    有什么方法可以使用 PHP 确定文件夹中图像的文件年龄 我想删除超过 2 小时的旧文件 是否可以在上传到文件夹时在其文件名中添加时间戳名称 如果是这样 请给我一个例子 thanks if time filemtime filename gt
  • 如何知道missModalViewControllerAnimated何时启动以及何时完成?

    有没有办法知道dismissModalViewControllerAnimated何时启动以及何时完成 例如viewWillAppear和viewDidAppear的习惯用法 与其他动画不同 这个动画似乎没有委托来告诉您 是的 而且比你想象
  • Sklearn Chi2 用于特征选择

    我正在学习 chi2 用于特征选择 并遇到了类似的代码this https chrisalbon com machine learning feature selection chi squared for feature selectio
  • 如何让 Mockito 模拟另一个文件中的常量?

    编辑 我正在测试的方法调用在另一个类中定义的这个常量 所以我想测试该方法是否独立于其他类定义常量的方式工作 嘲笑它是我能想到的第一件事 但我对如何以干净 安全的方式测试它的其他想法持开放态度 类 方法和变量名称已泛化 我正在尝试弄清楚如何编
  • 带 wamp 的国际扩展 php_intl.dll

    我想使用Moodle 但在安装过程中出现错误 应该安装并启用 php extension gt intl gt 以获得最佳结果 Intl 扩展用于改进国际化支持 例如区域设置感知排序 当我点击链接时 我收到上面的错误消息 http docs
  • C - 删除递归函数中的重复结果

    我必须创建一个递归函数 告诉您可以将多少美分变成零钱的方法 使用 25 美分 10 分 5 分 5 分 5 分硬币 到目前为止 我有一个递归函数可以做到这一点 但是它多次计算相同的组合 所以数字太大了 如何删除重复的组合 Code incl
  • PHP cURL 如何添加用户代理值或克服服务器阻止 cURL 请求?

    我正在传输一个对象数组 我有一个自己的服务器上的 cURL 客户端 提交者 and 监听别人服务器上的脚本 哪一个不在我的控制之下 然后我认为他们正在阻止传入的 cURL 请求因为当我用普通 HTML 测试时
  • 如何阻止无效用户的 git 提交?

    我正在运行一个gitlab https www gitlab com gitlab ce git 服务器 我的大多数用户都运行 3 个版本中的 1 个版本的 git git 1 7 1 centos 用户 git 1 7 9 其他人 git
  • Firefox 特定 CSS 导致 Visual Studio 中出现多个错误

    在 Visual Studio 2012 中 我尝试在我的外部样式表之一中使用以下 Firefox 特定 CSS moz document url prefix span4 ul li a focus border none span12
  • .Net 和 PHP Rijndael 加密不匹配

    起初我以为这是填充 因为 mcrypt 使用零填充 但我更改了 php 以使用 PKCS7 并得到了相同的精确结果 有人可以帮忙吗 我认为这与php中的填充有关 Net 的测试输出 Key d88f92e4fa27f6d45b49446c7