gpt4 book ai didi

python - 将 Python 移植到 Perl 脚本时出现编码/加密问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:13 28 4
gpt4 key购买 nike

我有一个运行良好的 Python 脚本。它能够解码/解密提供的密码,并对其进行编码/加密,如下所示:

#!/usr/bin/python

from Crypto.Cipher import DES3
import base64

secret = base64.decodestring('tcxpLw1PsMR0CtXt/HfbIZomvJtDyE6h1Gl4vblX2W4=')
key = secret[:24]
iv = secret[24:]

# Encoded Encrypted password
EEpwd = '4TOHTKsvihUXuUd9M3TpoA=='
print "Encoded Encrypted Password : ",EEpwd

# Decoded Encrypted password
DEpwd = base64.decodestring(EEpwd)

# Decoded Decrypted password
DDpwd = DES3.new(key, DES3.MODE_CBC, iv).decrypt(DEpwd)
print "Decoded (Decrypted ( PWD ) ) : ",DDpwd

# New Decoded Encrypted password
NewDEpwd = DES3.new(key, DES3.MODE_CBC, iv).encrypt(DDpwd)

# New Encoded Encrypted password
NewEEpwd = base64.b64encode(NewDEpwd)
print "New Encoded (Encrypted (",DDpwd,") ) : ",NewEEpwd

...这给了我以下输出:

Encoded Encrypted Password :  4TOHTKsvihUXuUd9M3TpoA==
Decoded (Decrypted ( PWD ) ) : MYweakPW
New Encoded (Encrypted ( MYweakPW ) ) : 4TOHTKsvihUXuUd9M3TpoA==

现在我必须将这个脚本迁移到 Perl,所以我做了:

#!/usr/bin/perl
use MIME::Base64;
use Crypt::CBC;

$secret = decode_base64('tcxpLw1PsMR0CtXt/HfbIZomvJtDyE6h1Gl4vblX2W4=');
$key = substr($secret,0,24);
$iv = substr($secret,24);

$cipher = Crypt::CBC->new(
-cipher => 'DES_EDE3',
-key => $key,
-iv => $iv,
-header => 'none',
-padding => 'null',
-literal_key => 1
);

# Encoded Encrypted password
$EEpwd = '4TOHTKsvihUXuUd9M3TpoA==';
print "Encoded Encrypted Password : ". $EEpwd ."\n";

# Decoded Encrypted password
$DEpwd = decode_base64($EEpwd);

# Decoded Decrypted password
$DDpwd = $cipher->decrypt($DEpwd);
print "Decoded (Decrypted ( PWD ) ) : $DDpwd \n";

# New Decoded Encrypted password
$NewDEpwd = $cipher->encrypt($DDpwd);

# New Encoded Encrypted password
$NewEEpwd = encode_base64($NewDEpwd);
print "New Encoded (Encrypted ($DDpwd) ) : $NewEEpwd \n";

...但这又回到了我:

Encoded Encrypted Password : 4TOHTKsvihUXuUd9M3TpoA==
Decoded (Decrypted ( PWD ) ) : MYweakPW
New Encoded (Encrypted (MYweakPW) ) : 4TOHTKsvihU=

问题:为什么当我在 Perl 中加密/编码密码时,它返回一个缩短的字符串?缺少什么才能匹配?

问候RZ


编辑

由于我正在更改已接受的答案,让我澄清一下此代码用法的某些方面,以证明某些选择的合理性。当然这不是整个脚本。我已经尽可能多地删除了任何私有(private)信息,以及已经在运行的脚本的其他部分,隔离了需要注意的代码部分。该脚本的总体目的是在远程服务器上更改密码时管理其他一些脚本/应用程序中使用的密码。

这段特定的代码处理 Remmina 在保存的 session 中存储的密码。不幸的是,Remmina 没有提供一个集中的方法来替换保存的密码,所以在我的例子中,每次我在 Windows 域更改密码时,我所有的 Remmina 保存的 session 都会过时(而且我有几十个!)

Remmina 存储密码的方式是:

  • $HOME/.remmina/remmina.pref有一行包含 secret=* ,编码,使用 DES3 keyiv

  • 在每个 session 文件中,名为 $HOME/.remmina/*.remmina有一行包含 password=*用你的密码,编码和加密

也就是说,说原始加密/编码密码是正确还是错误生成是无关紧要的......这就是 Remmina 的做法,我必须处理它:-/

根据命令行上提供的参数,脚本应该能够从 *.remmina 中检索存储的密码。文件,或获取一个新文件并在 *.remmina 上替换它文件,所以 @jm666 在他的 EDIT2 上提出的观点非常相关,因为当我从命令行获得新密码时,它不会以任何方式被填充。

对于我的特定场景,我知道密码永远不会短于 8 个字节,但可以更长,而且不能是 8 的倍数,所以我用新的不同密码测试了这个,并意识到,要加密密码Remmina,合适的是padding = 'null'

  • 一种特殊情况似乎是密码正好有 8 个字节长(或它的倍数)。在这种情况下,我不得不“手动”添加一个 null char 在提供的字符串末尾,强制填充添加额外的 null字符

最佳答案

您选择的填充选项似乎与 Python 加密库使用的选项不同。

我发现通过将-padding 选项更改为'space',重新加密的密码与原始密码相同。

关于python - 将 Python 移植到 Perl 脚本时出现编码/加密问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26187733/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com