批处理之家's Archiver

523066680 发表于 2017-12-21 10:13

[Perl]Crypt::CBC - 加密解密模块

[i=s] 本帖最后由 523066680 于 2017-12-21 11:18 编辑 [/i]

示例:

[list][list][table=80%, #f8f8f8][tr][td][font=consolas][size=2][font=consolas][size=3][color=#008000][b]use[/b][/color] Modern[color=#555555]::[/color]Perl[color=#555555];[/color]
[color=#008000][b]use[/b][/color] Data[color=#555555]::[/color]Dump qw[color=#555555]/dump/[/color][color=#555555];[/color]
[color=#008000][b]use[/b][/color] Crypt[color=#555555]::[/color]CBC[color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]$cipher[/color] [color=#555555]=[/color] Crypt[color=#555555]::[/color]CBC[color=#555555]->[/color][color=#555555]new[/color][color=#555555]([/color]
                    [color=#555555]-[/color]key    [color=#555555]=>[/color] [color=#ba2121]'password'[/color][color=#555555],[/color]
                    [color=#555555]-[/color]cipher [color=#555555]=>[/color] [color=#ba2121]'Blowfish'[/color][color=#555555],[/color]
                    [color=#555555]-[/color]header [color=#555555]=>[/color] [color=#ba2121]'randomiv'[/color][color=#555555],[/color]
               [color=#555555]);[/color]

[color=#b00040]my[/color] [color=#b00040]$ciphertext[/color] [color=#555555]=[/color] [color=#b00040]$cipher[/color][color=#555555]->[/color][color=#555555]encrypt[/color][color=#555555]([/color][color=#ba2121]"This data is hush hush"[/color][color=#555555]);[/color]
[color=#b00040]my[/color] [color=#b00040]$plaintext[/color]  [color=#555555]=[/color] [color=#b00040]$cipher[/color][color=#555555]->[/color][color=#555555]decrypt[/color][color=#555555]([/color][color=#b00040]$ciphertext[/color][color=#555555]);[/color]
[color=#b00040]say unpack[/color][color=#555555]([/color][color=#ba2121]"H*"[/color][color=#555555],[/color] [color=#b00040]$ciphertext[/color][color=#555555]);[/color]
[color=#b00040]say[/color] [color=#b00040]$plaintext[/color][color=#555555];[/color][/size][/font][/size][/font][/b][/td][/tr][/table][/list][/list]
Straberry Perl PDL 版本自带 Crypt 相关模块(Strawberry/perl/vendor/lib/crypt),
通常你可以直接使用 Crypt::RSA,Crypt::Blowfish 等模块,
但是这些模块需要手动对数据、密钥进行固定字节的对齐,而Crypt::CBC模块对这些细节做了自动处理。

-cipher 是加密/解密方案,支持 DSA,RSA,IDEA,DES,Blowfish,Twofish 等加密算法
-header 可以是 randomiv, salt, none 三种模式,默认情况下 salt 和 randomiv 都是随机取值。

在 $cipher 对象建立之后,可以重新设置 salt 和 randomiv,也可以通过 $cipher->salt() 的方式获取其值。

送一个示例,终端输入密码(显示星号),将脚本自身加密再解密:

[list][list][table=80%, #f8f8f8][tr][td][font=consolas][size=2][font=consolas][size=3][color=#555555]=[/color]info
    Author[color=#555555]:[/color] [color=#666666]523066680[/color]
    Date[color=#555555]:[/color] [color=#666666]2017[/color][color=#555555]-[/color][color=#666666]12[/color][color=#555555]-[/color][color=#666666]20[/color]
=cut

[color=#008000][b]use[/b][/color] Modern[color=#555555]::[/color]Perl[color=#555555];[/color]
[color=#008000][b]use[/b][/color] Win32[color=#555555]::[/color]Console[color=#555555];[/color]
[color=#008000][b]use[/b][/color] Crypt[color=#555555]::[/color]CBC[color=#555555];[/color]
[color=#008000][b]use[/b][/color] File[color=#555555]::[/color]Slurp[color=#555555];[/color]
[color=#008000][b]use[/b][/color] Time[color=#555555]::[/color]HiRes qw[color=#555555]/sleep/[/color][color=#555555];[/color]
[color=#008000][b]use[/b][/color] IO[color=#555555]::[/color]Handle[color=#555555];[/color]
STDOUT[color=#555555]->[/color][color=#555555]autoflush[/color][color=#555555]([/color][color=#666666]1[/color][color=#555555]);[/color]

[color=#b00040]our[/color] [color=#b00040]$IN[/color][color=#555555]=[/color]Win32[color=#555555]::[/color]Console[color=#555555]->[/color][color=#555555]new[/color][color=#555555]([/color]STD_INPUT_HANDLE[color=#555555]);[/color]
[color=#b00040]our[/color] [color=#b00040]$OUT[/color][color=#555555]=[/color]Win32[color=#555555]::[/color]Console[color=#555555]->[/color][color=#555555]new[/color][color=#555555]([/color]STD_OUTPUT_HANDLE[color=#555555]);[/color]
[color=#b00040]our[/color] [color=#b00040]$IN_DEFAULT[/color] [color=#555555]=[/color] [color=#b00040]$IN[/color][color=#555555]->[/color][color=#555555]Mode[/color][color=#555555]();[/color]
[color=#b00040]$IN[/color][color=#555555]->[/color][color=#555555]Mode[/color][color=#555555]([/color]ENABLE_MOUSE_INPUT[color=#555555]);[/color]

[color=#b00040]my[/color] [color=#b00040]$key[/color] [color=#555555]=[/color] get_password[color=#555555]();[/color]
cipher[color=#555555]([/color][color=#ba2121]"encrypt"[/color][color=#555555],[/color] [color=#b00040]$key[/color][color=#555555],[/color] __FILE__ [color=#555555],[/color]             __FILE__ [color=#555555].[/color][color=#ba2121]"_enc.txt"[/color][color=#555555], );[/color]
cipher[color=#555555]([/color][color=#ba2121]"decrypt"[/color][color=#555555],[/color] [color=#b00040]$key[/color][color=#555555],[/color] __FILE__ [color=#555555].[/color][color=#ba2121]"_enc.txt"[/color] [color=#555555],[/color] __FILE__ [color=#555555].[/color][color=#ba2121]"_dec.txt"[/color][color=#555555], );[/color]
pause[color=#555555]();[/color]

[color=#008000][b]sub[/b][/color] get_password
[color=#555555]{[/color]
    [color=#b00040]my[/color] [color=#b00040]@st[/color][color=#555555];[/color]
    [color=#b00040]my[/color] [color=#b00040]$inp[/color] [color=#555555]=[/color] [color=#ba2121]""[/color][color=#555555];[/color]
    [color=#b00040]print[/color] [color=#ba2121]"Password:"[/color][color=#555555];[/color]
    [color=#008000][b]while[/b][/color] [color=#555555]([/color][color=#666666]1[/color][color=#555555])[/color]
    [color=#555555]{[/color]
        [color=#b00040]sleep[/color] [color=#666666]0.01[/color][color=#555555];[/color]
        [color=#b00040]@st[/color] [color=#555555]=[/color] [color=#b00040]$IN[/color][color=#555555]->[/color][color=#555555]Input[/color][color=#555555]();[/color]
        [color=#008000][b]next if[/b][/color] [color=#555555]([/color][color=#b00040]$#st[/color] [color=#555555]<[/color] [color=#666666]0[/color][color=#555555]);[/color]
        [color=#008000][b]if[/b][/color] [color=#555555]([/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]0[/color][color=#555555]] ==[/color] [color=#666666]1[/color] [color=#b00040]and[/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]1[/color][color=#555555]] ==[/color] [color=#666666]1[/color] [color=#555555])[/color]
        [color=#555555]{[/color]
            [color=#008000][b]if[/b][/color] [color=#555555]([/color] [color=#b00040]chr[/color][color=#555555]([/color][color=#b00040]$st[/color][color=#555555][[/color][color=#666666]5[/color][color=#555555]]) =~[/color] [color=#555555]/[\x20-\x7e]/[/color] [color=#555555]) {[/color] [color=#b00040]print[/color] [color=#ba2121]"*"[/color][color=#555555];[/color] [color=#b00040]$inp[/color] [color=#555555].=[/color] [color=#b00040]chr[/color][color=#555555]([/color][color=#b00040]$st[/color][color=#555555][[/color][color=#666666]5[/color][color=#555555]]) }[/color]
            [color=#008000][b]elsif[/b][/color] [color=#555555]([/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]5[/color][color=#555555]] ==[/color] [color=#666666]27[/color] [color=#555555]) {[/color] [color=#008000][b]exit[/b][/color] [color=#555555]}[/color]
            [color=#008000][b]elsif[/b][/color] [color=#555555]([/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]5[/color][color=#555555]] ==[/color] [color=#666666]13[/color] [color=#555555]) {[/color] [color=#b00040]print[/color] [color=#ba2121]"[/color][color=#ba2121]\n[/color][color=#ba2121]"[/color][color=#555555];[/color] [color=#008000][b]last[/b][/color]   [color=#555555]}[/color]
            [color=#008000][b]elsif[/b][/color] [color=#555555]([/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]5[/color][color=#555555]] ==[/color] [color=#666666]8[/color] [color=#555555])  {[/color] backspace[color=#555555]([/color] \[color=#b00040]$inp[/color] [color=#555555]) }[/color]
        [color=#555555]}[/color]
    [color=#555555]}[/color]
    [color=#008000][b]return[/b][/color] [color=#b00040]$inp[/color][color=#555555];[/color]
[color=#555555]}[/color]

[color=#008000][b]sub[/b][/color] backspace
[color=#555555]{[/color]
    [color=#b00040]my[/color] [color=#b00040]$s_ref[/color] [color=#555555]=[/color] [color=#b00040]shift[/color][color=#555555];[/color]
    [color=#008000][b]if[/b][/color] [color=#555555]([/color] [color=#b00040]length[/color][color=#555555]($[/color][color=#b00040]$s_ref[/color][color=#555555]) >[/color] [color=#666666]0[/color] [color=#555555])[/color]
    [color=#555555]{[/color]
        [color=#b00040]print[/color] [color=#ba2121]"[/color][color=#ba2121]\b \b[/color][color=#ba2121]"[/color][color=#555555];[/color]
        [color=#555555]$[/color][color=#b00040]$s_ref[/color] [color=#555555]=~[/color] [color=#555555]s/.$//[/color][color=#555555];[/color]
    [color=#555555]}[/color]
[color=#555555]}[/color]

[color=#008000][b]sub[/b][/color] pause
[color=#555555]{[/color]
    [color=#b00040]print[/color] [color=#ba2121]"Press any key to continue ..."[/color][color=#555555];[/color]
    [color=#b00040]my[/color] [color=#b00040]@st[/color][color=#555555];[/color]
    [color=#008000][b]while[/b][/color] [color=#555555]([/color][color=#666666]1[/color][color=#555555])[/color]
    [color=#555555]{[/color]
        [color=#b00040]sleep[/color] [color=#666666]0.02[/color][color=#555555];[/color]
        [color=#b00040]@st[/color] [color=#555555]=[/color] [color=#b00040]$IN[/color][color=#555555]->[/color][color=#555555]Input[/color][color=#555555]();[/color]
        [color=#008000][b]next if[/b][/color] [color=#555555]([/color][color=#b00040]$#st[/color] [color=#555555]<[/color] [color=#666666]0[/color][color=#555555]);[/color]
        [color=#008000][b]exit if[/b][/color] [color=#555555]([/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]0[/color][color=#555555]] ==[/color] [color=#666666]1[/color] [color=#b00040]and[/color] [color=#b00040]$st[/color][color=#555555][[/color][color=#666666]1[/color][color=#555555]] ==[/color] [color=#666666]1[/color] [color=#555555]);[/color]
    [color=#555555]}[/color]
[color=#555555]}[/color]

[color=#008000][b]sub[/b][/color] cipher
[color=#555555]{[/color]
    [color=#b00040]my[/color] [color=#555555]([/color][color=#b00040]$mode[/color][color=#555555],[/color] [color=#b00040]$key[/color][color=#555555],[/color] [color=#b00040]$src[/color][color=#555555],[/color] [color=#b00040]$dst[/color][color=#555555]) =[/color] [color=#b00040]@_[/color][color=#555555];[/color]
    [color=#b00040]say[/color] [color=#ba2121]"${mode}ing"[/color][color=#555555];[/color]
    [color=#b00040]my[/color] [color=#b00040]$cipher[/color] [color=#555555]=[/color] Crypt[color=#555555]::[/color]CBC[color=#555555]->[/color][color=#555555]new[/color][color=#555555]( -[/color]key [color=#555555]=>[/color] [color=#b00040]$key[/color][color=#555555], -[/color]cipher [color=#555555]=>[/color] [color=#ba2121]'Blowfish'[/color] [color=#555555]);[/color]
    [color=#b00040]my[/color] [color=#b00040]$stream[/color] [color=#555555]=[/color] read_file[color=#555555]([/color] [color=#b00040]$src[/color][color=#555555],[/color] [color=#b00040]binmode[/color] [color=#555555]=>[/color] [color=#ba2121]":raw"[/color] [color=#555555]);[/color]
    [color=#b00040]my[/color] [color=#b00040]$result[/color] [color=#555555]=[/color] [color=#b00040]$cipher[/color][color=#555555]->[/color][color=#b00040]$mode[/color][color=#555555]([/color] [color=#b00040]$stream[/color] [color=#555555]);[/color]
    write_file[color=#555555]([/color] [color=#b00040]$dst[/color][color=#555555], {[/color] [color=#b00040]binmode[/color] [color=#555555]=>[/color] [color=#ba2121]":raw"[/color] [color=#555555]},[/color] [color=#b00040]$result[/color] [color=#555555]);[/color]
[color=#555555]}[/color][/size][/font][/size][/font][/b][/td][/tr][/table][/list][/list][Finished in 0.4s]

ivor 发表于 2017-12-21 15:05

前排支持{:3_56:}

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.