V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
waterlaw
V2EX  ›  程序员

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

  •  1
     
  •   waterlaw ·
    water-law · Nov 20, 2018 · 6044 views
    This topic created in 2727 days ago, the information mentioned may be changed or developed.

    和同学在 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 replies    2018-12-03 04:34:41 +08:00
    Yanni0507
        1
    Yanni0507  
       Nov 20, 2018
    你这里的 Base64,意义在哪里啊?
    keller
        2
    keller  
       Nov 20, 2018
    既然都 RSA 了还 Base64 做什么
    waterlaw
        3
    waterlaw  
    OP
       Nov 20, 2018
    @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
       Nov 20, 2018
    @keller 我没想到 rsa.encrypt(message.encode(), pubkey) 后的字节这么没有规律, 这个 RSA 的数据换成人话( str )应该是什么?
    likuku
        5
    likuku  
       Nov 20, 2018
    GnuPG 双方交换 pub key,收发信息 先用 GPG 加密签名用 ASCII 格式输出,黏贴进聊天软件直接发嘛~

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

    聊 boss 不喜欢看到的内容的时候,别用 TIM 不就行了…
    sunny352787
        29
    sunny352787  
       Nov 20, 2018
    ...为啥不让 TIM 走 SS 代理呢?
    Suzutan
        30
    Suzutan  
       Nov 20, 2018 via Android
    要是能直接以 ntrqq 那种方式实现就好了,省的手动复制粘贴(
    mmdsun
        31
    mmdsun  
       Nov 20, 2018 via Android
    警告⚠。小心被查水表容易引起公安调查。因为文字加密
    Koishi
        32
    Koishi  
       Dec 3, 2018
    @whoami9894 PCQQ 的协议一直都被摸得光光的... 随便去搜搜 PCQQ 机器人就能找到
    不过 ECDH 的密钥协商可以防止中间人攻击,Boss 无法通过你发给 tx 的数据解出内容
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1378 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 17:18 · PVG 01:18 · LAX 10:18 · JFK 13:18
    ♥ Do have faith in what you're doing.