代码之家  ›  专栏  ›  技术社区  ›  chew socks

用openssl enc解密

  •  1
  • chew socks  · 技术社区  · 7 年前

    我正在用加密数据 openssl enc 但是在默认的二进制模式下,我得到了大量的垃圾数据;但是在ASCII模式下,一切都可以正常工作。

    给出以下定义:

    iv=1968879c2ae5b6e4bdd2823b5e9fa54a
    enc() { key=$1; shift; openssl enc -K "$key" -iv "$iv" -aes-256-ctr -p -nosalt "$@"; }
    dec() { key=$1; shift; openssl enc -d -K "$key" -iv "$iv" -aes-256-ctr -p -nosalt "$@"; }
    

    …运行

    enc 33 -a <<<test123 | dec 33 -a | hexdump -C
    

    …正确发射:

    00000000  6b 65 79 3d 33 33 30 30  30 30 30 30 30 30 30 30  |key=330000000000|
    00000010  30 30 30 30 30 30 30 30  30 30 30 30 30 30 30 30  |0000000000000000|
    *
    00000040  30 30 30 30 0a 69 76 20  3d 31 39 36 38 38 37 39  |0000.iv =1968879|
    00000050  43 32 41 45 35 42 36 45  34 42 44 44 32 38 32 33  |C2AE5B6E4BDD2823|
    00000060  42 35 45 39 46 41 35 34  41 0a 74 65 73 74 31 32  |B5E9FA54A.test12|
    00000070  33 0a                                             |3.|
    00000072
    

    而不做同样的事情 -a 发出二进制垃圾;使用 base64 要使输出可打印,

    enc 33 <<<test123 | dec 33 | hexdump -C
    

    …在输出时发出比 test123 :

    00000000  6b 65 79 3d 33 33 30 30  30 30 30 30 30 30 30 30  |key=330000000000|
    00000010  30 30 30 30 30 30 30 30  30 30 30 30 30 30 30 30  |0000000000000000|
    *
    00000040  30 30 30 30 0a 69 76 20  3d 31 39 36 38 38 37 39  |0000.iv =1968879|
    00000050  43 32 41 45 35 42 36 45  34 42 44 44 32 38 32 33  |C2AE5B6E4BDD2823|
    00000060  42 35 45 39 46 41 35 34  41 0a 2f 5a 77 fb 7a 37  |B5E9FA54A./Zw.z7|
    00000070  ca 60 43 f6 17 ce 13 da  d8 40 f9 78 30 6f 44 60  |.`C......@.x0oD`|
    00000080  fc b4 63 05 69 38 45 b3  19 8c 04 bc 79 0e 0e de  |..c.i8E.....y...|
    00000090  10 3f d3 9e 19 d6 8c 93  67 3b 20 5a 9f cd c2 3f  |.?......g; Z...?|
    000000a0  76 36 2a 71 31 c0 a0 49  fc 4a c0 aa b0 b1 c7 e2  |v6*q1..I.J......|
    000000b0  1c c5 0a 54 b7 d9 e4 b4  8a 2e 05 4a f4 3b 9c 01  |...T.......J.;..|
    000000c0  37 fc 0e 69 a8 86 f7 cd  21 a3 2e 94 0a 1f fa b3  |7..i....!.......|
    000000d0  07 61 26 d9 b4 e0 b6 6f  3a e6 72 e8              |.a&....o:.r.|
    000000dc
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   oliv    7 年前

    这个 -p 选择权 openssl 它输出键和IV,给出这些垃圾字节。

    如果你移除这个 -P 选项从 enc() 功能,那就行了。

    -a 选项, OpenSSL 从输入中跳过非base64字符串(即键和IV信息),这就是它工作的原因。

    实例:

    echo test123 | openssl enc -K 33 -iv 0 -aes-256-ctr -p -nosalt | openssl enc -d -K 33 -iv 0 -aes-256-ctr -p -nosalt  
    # -> fail
    echo test123 | openssl enc -K 33 -iv 0 -aes-256-ctr -p -nosalt -a | openssl enc -d -K 33 -iv 0 -aes-256-ctr -p -nosalt -a
    # -> OK
    echo test123 | openssl enc -K 33 -iv 0 -aes-256-ctr -nosalt | openssl enc -d -K 33 -iv 0 -aes-256-ctr -p -nosalt
    # -> OK
    
    推荐文章