与 java 和 .net 相比,mcrypt blowfish php 结果略有不同

2024-01-01

以下是一些更改了键值和有效负载的示例代码:

$key = '/4rTInjwg/H/nA==';
$key = base64_decode($key);

$data = 'val=100|val=200|val=300|val=400|val=500|val=600|val=700|val=800|val=900|';
$data.= 'val2=100|val2=200|val2=300|val2=400|val2=500|val2=600|val2=700|val2=800|val2=900|';
$data.= 'val3=100|val3=200|val3=300|val3=400|val3=500|val3=600|val3=700|val3=800|val3=900|';
$data.= 'val4=100|val4=200|val4=300|val4=400|val4=500|val4=600|val4=700|val4=800|val4=900|';

$result = base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,$key, $data, MCRYPT_ENCRYPT));

这在 PHP 中加密和解密效果很好,但 Java 和 .NET 给出了不同的值,更糟糕的是,我无法解密 Java 或 .NET 的结果。当我尝试从 java 解密这些值时,我得到一个字符串,该字符串一开始是正确的,但中途却变成了垃圾。我正在 Windows XP 5.3x 中工作,以防有人想知道。

虽然我 STFW 我注意到有几个线程,其中最后的评论提到了由于输入问题而导致 base64 弄乱结果的事情,我想知道这是否是发生的事情,因为结果非常接近,前 50 个左右的字符匹配,然后事情就转到@#$!。

我还阅读了一些有关块大小和填充的线程,但似乎没有人就填充应该是什么达成一致。我真的需要知道Java是否正在填充文本,默认块大小是多少,填充是什么?见下文:

java开发人员正在做:

    import org.apache.commons.codec.binary.Base64;
    import java.util.ResourceBundle;
    import com.sun.crypto.provider.SunJCE;

    ... snip ...

    StringBuffer ourTransferBuffer = new StringBuffer(s);
    byte abyte0[] = Base64.decodeBase64(encryptionKey);
    SunJCE sunjce = new SunJCE();
    Security.addProvider(sunjce);
    SecretKeySpec secretkeyspec = new SecretKeySpec(abyte0, "Blowfish");
    Cipher cipher = Cipher.getInstance("Blowfish");
    cipher.init(1, secretkeyspec);
    byte abyte1[] = cipher.doFinal(ourTransferBuffer.toString().getBytes());
    s = Base64.encodeBase64String(abyte1);
    return s;

    ... snip ...

我已经在这上面浪费了太多时间,有人有什么想法吗?谢谢。


想通了,简单的 pkcs5 填充解决了这个问题。

... snip  ...

$data = 'val=100|val=200|val=300|val=400|val=500|val=600|val=700|val=800|val=900|';
$data.= 'val2=100|val2=200|val2=300|val2=400|val2=500|val2=600|val2=700|val2=800|val2=900|';
$data.= 'val3=100|val3=200|val3=300|val3=400|val3=500|val3=600|val3=700|val3=800|val3=900|';
$data.= 'val4=100|val4=200|val4=300|val4=400|val4=500|val4=600|val4=700|val4=800|val4=900|';

$blocksize = mcrypt_get_block_size('blowfish', 'ecb'); // get block size
$pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length
$data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data

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

与 java 和 .net 相比,mcrypt blowfish php 结果略有不同 的相关文章

随机推荐

  • 多个输出路径(Java - Hadoop - MapReduce)

    我做了两项 MapReduce 作业 我希望第二项作业能够将结果写入两个不同目录中的两个不同文件中 我想要某种类似于 FileInputFormat addInputPath multiple input path 的东西 但对于输出 我对
  • 回购同步重复路径问题

    我已经为oneplus构建cyanogenmod有一段时间了 我已经用boeffla内核替换了库存内核 但是截至今天我遇到了一个问题 之前能够与新内核重新同步 一切都说现在当我进行回购同步时 致命 home noahvt BuildServ
  • 在android中创建缩放位图时保持图像质量

    我有一张尺寸为 960x800 的图像 我试图让它填满屏幕 我目前的做法是加载完整的 960x800 位图并使用源和目标Rect对象 到目前为止 我的目标矩形为 480x320 屏幕尺寸 源矩形为 960x800 background Bi
  • 如何使用“...”(变量)参数? [复制]

    这个问题在这里已经有答案了 可能的重复 C 和 C 中的可变参数函数是什么 https stackoverflow com questions 3870128 what are variadic functions in accordanc
  • 放大一条曲线,使其可以沿着 R 图中的另一条曲线显示

    我有一个 R 图 我想在其中展示IF the red curve 现在位于图的底部 未正确显示 乘以一个常数 它可以match the blue curve目前显示 我想知道我怎样才能最好scale up the 红 曲线以便它准确地mat
  • Apache Derby - java.sql.SQLException:无法启动数据库

    首先 这是我第一次使用 Apache Derby 我正在使用 netbeans 愿意使用嵌入式 apache derby 并且我按照以下教程配置和安装数据库 然后 我使用项目属性将 derby jar 文件附加到我的项目中 http net
  • Angular2 - ngOnDestroy() 未在类似路线上调用

    我有一个 Angular2 应用程序 其路线如下 path component ContentComponent children path folder folderId resolve currentFolder CurrentFold
  • 使用 CefSharp v65 加载本地 html/css/js 文件

    我正在尝试在 WinForms 中使用 CefSharp v65 加载本地 html css js 文件 我找到了与此相关的其他堆栈溢出帖子 但他们都没有使用新的内置版本FolderSchemeHandlerFactory 而不是实现他们自
  • 如果第二个输入字段已填充,则禁用输入字段

    完全是个新手 我只想知道当第二个输入字段被填充时如何动态禁用输入字段 eg td td
  • 将列中的所有行更新为新值

    抱歉 我确信这个问题已经被问过很多次了 但我已经四处寻找一个很好的例子 但一直没能找到 我想运行一种方法将值插入到表中所有行的特定列中 为了让您了解我正在使用的方法和查询 这是我的学生表的工作更新方法 public void updateS
  • 拉丁字符检查

    那里有一些类似的问题 但没有一个是完全相同的或者有适合我的答案 我需要一个javascript函数来验证文本字段是否包含所有有效的拉丁字符 因此没有cryllic或中文 只有拉丁文 具体来说 基本拉丁语 不包括 C0 控制字符 Latin
  • 为 python 2.7 安装 MySQLdb 返回错误

    pip install MySQL python 1 2 4b4 tar gz 在 Python 2 7 ubuntu 18 04 上返回此错误 你能帮助我吗 pip install MySQL python 1 2 5 zip Proce
  • 为什么当 repo 变大时 git 操作会变慢

    我知道当 repo 变大时 git 会变慢 但为什么 由于 git 将文件存储为单独的目录和文件 git 我不知道为什么操作变慢 让我们来看看commit手术 最近 我从 master 克隆了 webkit 存储库和分支 然后我提交了一个2
  • 在 NodeJS 中使用 JSONStream 时出现内存不足问题

    我正在尝试使用 NodeJS 中的 JSONStream 库将 json 94mb 大 从 http 请求流式传输到本地文件 但是 该应用程序崩溃了out of memory错误 即使使用 256mb 内存标志调用代码 node max o
  • 扩展 lib.d.ts 中定义的变量的类型定义

    我有一些使用 mootools 的遗留代码需要转换 Mootools 引入了一个新的带有两个参数的 Element 构造函数 我没有找到 mootools 的任何类型定义文件 所以我必须自己编写 Typescript 标准库 lib d t
  • 清单合并失败:需要为 显式指定 android:exported

    合并错误 错误 android exported 需要为元素显式指定 面向 Android 12 及更高版本的应用需要指定 显式值android exported当对应的组件 定义了一个意图过滤器 看https developer andr
  • 取代标准 C++ 分配器?

    我想用更强大的分配器替换标准分配器 C 标准只需要对 vector resize 进行溢出检查 许多库提供的各种 C 分配器在提供负面的自测试时都会一败涂地 我可以使用更强大的分配器 ESAPI 的分配器不仅检查溢出 还具有调试工具来帮助发
  • 如何从GZIPed数据的InputStream中获取解压缩数据的InputStream?

    我调用一个返回 gzip 压缩文件的服务 我将数据作为输入流 由javax activation DataHandler getInputStream 来自响应 我想做的是 在不向磁盘写入任何内容的情况下 获取存档中文件中解压缩数据的 In
  • 具有独立条件的 NHibernate 查询...

    我有这个 var query session Query
  • 与 java 和 .net 相比,mcrypt blowfish php 结果略有不同

    以下是一些更改了键值和有效负载的示例代码 key 4rTInjwg H nA key base64 decode key data val 100 val 200 val 300 val 400 val 500 val 600 val 70