V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waterlaw
V2EX  ›  程序员

写了一个 RSA + Base64 加密的程序,要不来试试?

  •  1
     
  •   waterlaw ·
    water-law · 2018-11-20 15:58:08 +08:00 · 5208 次点击
    这是一个创建于 2187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    和同学在 TIM 上聊天, 他说 TIM 记录被 Boss 查水表了, 心想现在聊天软件都这么不安全了, 想到非对称加密, 又由于 TIM 文字的限制, 故使用 RSA + Base64 双重加密。 这里我有一个问题, 平时在阿里云使用 ssh 生成密钥对的时候, 在 ~/.ssh 目录下有一个 authorized_keys 的文件, 格式是

    ssh-rsa xxxx xxx@DESKTOP
    

    这个是有特定格式么? 如果我也采用类似文件来记录别人给我的公钥, 那该怎么解析(考虑换行空格等, 主要是不同编辑器的换行不大一样, 如一个公钥在记事本中是单行但用 Nodepad++ 打开却变为多行)。

    使用方法:

    rsatool encode "hello"
    

    在 C:\Users[Her/His User Name].ssh 生成公钥, 把公钥拷给别人, 对方需在 .ssh 下新建 pub\YOUR_USER_NAME 目录, 将你给的秘钥复制到这里,/doge, 要是像 authorized_keys 那样管理文件就好了, 建个啥目录。

    对方加密

    rsatool encode "hello" -u YOUR_USER_NAME
    

    你用私钥解密

    rsatool decode '加密后的数据'
    

    其实 V2 朋友喜欢使用 Base64 加密邮箱和微信号码的方式很简单就知道明文了, 使用 RSA 可以让对方以密文的方式传输数据, 当然明文只有你自己知道。

    PS:

    闲来无事,毫无技术含量, 主要用 pyinstaller 打包 python 脚本, 欢迎各位来喷。

    github

    32 条回复    2018-12-03 04:34:41 +08:00
    Yanni0507
        1
    Yanni0507  
       2018-11-20 16:10:15 +08:00
    你这里的 Base64,意义在哪里啊?
    keller
        2
    keller  
       2018-11-20 16:19:28 +08:00
    既然都 RSA 了还 Base64 做什么
    waterlaw
        3
    waterlaw  
    OP
       2018-11-20 16:22:54 +08:00
    @Base64 我用 Windows, 在 RSA 加密后, 数据是

    ```
    python3 rsatool.py encode "as" -u xxx
    ```

    ```
    b'v\x83\xe5\x9c\x94\n\xfc9jX\xa6\xdfG\x96]\x13\x9d\x06\x1d+Y(\x8eYPlG\x0b\xb0>\x96\x1a\xcb\x14x/v\r\xb8\xb3\x0b\x15J\x971\xf2\\\x07bI\x16{c\x8a\x
    c6\xaaFFB;\xc6<\xcbE\xac\x99\x1dS\xf1\xab\xad\x9b\xc8\xb9\xc7\x18\x8e\xba\xaf\x95\x88\xcb\x1b\xd2\xf7\xec\x8cC\x83~\x13Zn3\x85s\xaat\xd9yT\x9eY\x
    97|\xb0\x94|^4\xfc\xa6D$\xd4\xae\xfc\xe6\x02\x89\x19\x99;\x12\x8c\xea\x11\x88'

    ```
    不给它 Base64 一下怎么弄?
    waterlaw
        4
    waterlaw  
    OP
       2018-11-20 16:25:09 +08:00
    @keller 我没想到 rsa.encrypt(message.encode(), pubkey) 后的字节这么没有规律, 这个 RSA 的数据换成人话( str )应该是什么?
    likuku
        5
    likuku  
       2018-11-20 16:31:32 +08:00
    GnuPG 双方交换 pub key,收发信息 先用 GPG 加密签名用 ASCII 格式输出,黏贴进聊天软件直接发嘛~

    另外,还有 Telegram 的 端对端加密+阅后即焚 的 secret chat 模式。
    hjc4869
        6
    hjc4869  
       2018-11-20 16:33:29 +08:00 via iPhone
    binary 变 text 用 base64 没毛病。
    一楼二楼如果愿意每次说话都发 binary 文件那不 base64 也行。
    waterlaw
        7
    waterlaw  
    OP
       2018-11-20 16:33:53 +08:00
    @likuku 我朋友多是用 TIM, pub key 无论如何是必要的。
    ZombieMisaka
        8
    ZombieMisaka  
       2018-11-20 16:34:02 +08:00
    单纯 rsa 多慢啊,加一个 aes 之类的对称加密吧,私钥给摘要值签名,证书给加密用的 key 加密
    Bryan0Z
        9
    Bryan0Z  
       2018-11-20 16:36:38 +08:00 via Android
    RSA 这种非对称加密很慢的,应该考虑 AES 等对称加密
    waterlaw
        10
    waterlaw  
    OP
       2018-11-20 16:36:44 +08:00
    @ZombieMisaka en, 可以。
    reechangs
        11
    reechangs  
       2018-11-20 16:36:55 +08:00 via Android
    应该是深信服之类的软件吧,Tim,微信通过代理不就好了?
    likuku
        12
    likuku  
       2018-11-20 16:37:18 +08:00
    @waterlaw 所以,直接用 GPG 不就好了,所需的功能都有(加解密,电子签名)。
    waterlaw
        13
    waterlaw  
    OP
       2018-11-20 16:48:47 +08:00
    我发现关于椭圆曲线加密的方式比较少, 也没有现成的方案, 不知道是不是还没大范围地推广?
    wevsty
        14
    wevsty  
       2018-11-20 16:51:36 +08:00
    推广一下我写的小工具好了。
    交换了密钥以后就可以进行安全的通信了,采用 Qt 开发,默认使用 AES-256-CFB 作为加密算法,可以把密钥保存为文件方便管理。
    https://github.com/wevsty/en_message/releases
    waterlaw
        15
    waterlaw  
    OP
       2018-11-20 16:55:36 +08:00
    @wevsty 大佬啊, 这个 https://www.cryptopp.com/ 有点厉害, 这个项目维护多久了?
    wevsty
        16
    wevsty  
       2018-11-20 16:59:48 +08:00
    @waterlaw
    Crypto++这项目很早了,据悉第一个版本大约在 1995 年,不过这个项目一直是在维护的,也算是常用的加密库之一吧。
    iwtbauh
        17
    iwtbauh  
       2018-11-20 17:26:11 +08:00 via Android
    为什么不直接用 openssl cli
    whoami9894
        18
    whoami9894  
       2018-11-20 17:44:56 +08:00 via Android
    我记得 PC 端 QQ 通讯协议不是还没被破解吗
    jorneyr
        19
    jorneyr  
       2018-11-20 17:47:57 +08:00
    @Yanni0507 应该 RSA 加密的结果是字节数组, 很多是不可见字符, BASE64 把字节数组转为字符进行发送
    37Y37
        20
    37Y37  
       2018-11-20 17:52:15 +08:00
    这个应该是很好的一个应用场景了
    https://mp.weixin.qq.com/s/dpGqieL4WCmGdQh1AEG4Gw
    Yanni0507
        21
    Yanni0507  
       2018-11-20 17:54:11 +08:00
    @jorneyr 是哦,忘了这茬了,谢谢!
    Yanni0507
        22
    Yanni0507  
       2018-11-20 18:04:49 +08:00
    @waterlaw
    现成方案是有的,对称加密有 SM1,SM4,不对称加密有 SM2,摘要有 SM3 ;
    OpenSSL v1.1.1 里面是有 SM2,SM3,SM4 可以用的;
    RSA 算法核心简单,唯一,区别只在于密钥长度。ECC 在算法上相对复杂,曲线的选择和安全性比较是很麻烦的,所以很难统一意见,形成标准,所以推广比较慢,不过国内也有很多地方已经在应用了
    t6attack
        23
    t6attack  
       2018-11-20 18:07:13 +08:00
    @37Y37 非对称加密的作用,可以用简单的语言描述下:
    一个偷比特币钱包的木马。公钥包含在程序中,然后可以把加密的结果大摇大摆的发到公共网页上。公钥、加密密文全世界可见。但全世界只有作者能从中还原出钱包。
    Yanni0507
        24
    Yanni0507  
       2018-11-20 18:07:36 +08:00
    @ZombieMisaka
    按这个思路走下去最终可能会发现自己就是实现了一个 ssl 协议……
    lululau
        25
    lululau  
       2018-11-20 18:10:45 +08:00
    5L 正解,PGP/GPG,傻瓜一点的 Keybase
    t6attack
        26
    t6attack  
       2018-11-20 18:39:10 +08:00
    php 写法
    <?php
    //演示密钥 公钥
    $pubKey = "-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtSYK/cEu44hRH9FPYL+OkltL1
    LULkj/2BHaVnq/oNpI2YSCBlhDYlbBTdtIe8hrxM/FzddvsmLYyqvfJkWPs7hDuu
    9OMPRrtZDN0dELiCVhUl3B1i/HIdP39yseU4//zjiw85Bn6cX9SVfwBBl85uQjsT
    P5rto2YoA2TgAe1ujQIDAQAB
    -----END PUBLIC KEY-----";

    //演示密钥 私钥
    $privKey = "-----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQDtSYK/cEu44hRH9FPYL+OkltL1LULkj/2BHaVnq/oNpI2YSCBl
    hDYlbBTdtIe8hrxM/FzddvsmLYyqvfJkWPs7hDuu9OMPRrtZDN0dELiCVhUl3B1i
    /HIdP39yseU4//zjiw85Bn6cX9SVfwBBl85uQjsTP5rto2YoA2TgAe1ujQIDAQAB
    AoGAEcyV1i5iP7gVtWAKegj9lncJ1AJVJjf22ByVL7WiyCszw9yFMZg9R4lX91l3
    ZRjmPxAfFy25oR+Bkb011XknPyaqL7LSjQABU2jpFoyclAy9rWPhnn5G8Xwvqz8V
    +i6wm5UP2yPTpCbxqwYo6/RgdkKfVQ4DLep3L7R0sbfgaTECQQD914iokrHAP014
    S+r8WKV5GiZ121rOsiGvjuvvIHatLIzeXHpwL04T8QhCcvKDdypT3x4VFg3lVLrf
    OsmbYSp7AkEA703yYQbYSfTjrb7XYX2deLLQqMHN3DrkRy7WZWMAJ1edaNJlPkM5
    v5vLUZfScuMa8ZvsI6IKJl5iVA1v8IoglwJBALqx8B/TrIoxxL+qTo0Egcec9RaP
    m60UFHRzkJFSdhaOApl0uNST5kACccm1kyof1fDT0+M8UkIOXFbcfPUbtMsCQDtb
    mkN27y9pDxCJxeLoxaaqtBcn+2glM3p0o7mCVQdtNB5MEdDf2/MrMcOLZSgaLRTB
    GFG+X8Ykoz82Fg4UNQECQGS/gykmpWt3zdRh4rgkgFZ3BBrVUeDIphvwvrvvihIi
    +FyROFWU9yQznu46djdeRlwaBhieFaN1nFsI5h3UMFo=
    -----END RSA PRIVATE KEY-----";

    //测试数据
    $data = "test data 123456789";

    //公钥加密
    openssl_public_encrypt($data, $encryptData, $pubKey);
    $encryptData = base64_encode($encryptData);
    echo $encryptData;

    echo "\n";

    //私钥解密
    $encryptData = base64_decode($encryptData);
    openssl_private_decrypt($encryptData, $decryptData, $privKey);
    echo $decryptData;
    ?>
    ytmsdy
        27
    ytmsdy  
       2018-11-20 18:49:24 +08:00 via iPhone
    base64 不是加密算法!
    ETiV
        28
    ETiV  
       2018-11-20 18:56:12 +08:00 via iPhone
    问题的根源难道不是“用 TIM ”吗

    聊 boss 不喜欢看到的内容的时候,别用 TIM 不就行了…
    sunny352787
        29
    sunny352787  
       2018-11-20 18:59:07 +08:00
    ...为啥不让 TIM 走 SS 代理呢?
    Suzutan
        30
    Suzutan  
       2018-11-20 19:03:25 +08:00 via Android
    要是能直接以 ntrqq 那种方式实现就好了,省的手动复制粘贴(
    mmdsun
        31
    mmdsun  
       2018-11-20 19:10:01 +08:00 via Android
    警告⚠。小心被查水表容易引起公安调查。因为文字加密
    Koishi
        32
    Koishi  
       2018-12-03 04:34:41 +08:00
    @whoami9894 PCQQ 的协议一直都被摸得光光的... 随便去搜搜 PCQQ 机器人就能找到
    不过 ECDH 的密钥协商可以防止中间人攻击,Boss 无法通过你发给 tx 的数据解出内容
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5409 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:32 · PVG 16:32 · LAX 00:32 · JFK 03:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.