dongtai6741 2016-04-06 12:10
浏览 219
已采纳

开始-如何从字符串设置RSA公钥模数?

I am trying to encrypt a password with Go's RSA package.

Here is what I have so far:

package main

import (
    "fmt"
    "time"
    "net/http"
    "strconv"
    "io/ioutil"
    "encoding/json"
    "errors"
    "crypto/rsa"
    "crypto/rand"
    //"math/big"
)

func main() {
    if err := Login("username", "password"); err != nil {
        fmt.Println(err)
    }
}

func Login(username, password string) error {
    doNotCache := strconv.FormatInt(time.Now().UnixNano() / int64(time.Millisecond), 10)

    // Get RSA Key
    resp, err := http.PostForm("https://steamcommunity.com/login/getrsakey/", map[string][]string{
        "donotcache": {doNotCache},
        "username": {username},
    })
    if err != nil {
        return err
    }

    content, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return err
    }

    var decoded map[string]interface{}
    err = json.Unmarshal(content, &decoded)
    if err != nil {
        return err
    }

    if decoded["success"] != true {
        return errors.New("Failed to retrieve RSA key.")
    }

    // Set encryption variables
    var privateKey *rsa.PrivateKey
    var publicKey *rsa.PublicKey
    var plain_text, encrypted []byte

    plain_text = []byte(password)

    // Generate Private Key
    if privateKey, err = rsa.GenerateKey(rand.Reader, 1024); err != nil {
        return err
    }

    privateKey.Precompute()

    if err = privateKey.Validate(); err != nil {
        return err
    }

    publicKey.N = decoded["publickey_mod"].(string) // <- This is not right, I need to create a modulus from the publickey_mod string and it needs to be of type big.Int
    publicKey.E = decoded["publickey_exp"].(int)

    encrypted, err = rsa.EncryptPKCS1v15(rand.Reader, publicKey, plain_text)
    if err != nil {
        return err
    }

    fmt.Printf("PKCS1 Encrypted [%s] to 
[%x]
", string(plain_text), encrypted)

    return nil
}

I am unable to set the publicKey.N value to a big.Int from a given string.

variable decoded["publickey_mod"] looks something like this:

D3ABCD8303F887E0C7B390E088F24A797FE7084555FFB8BCE21F25EDD1F0DD02F48743EBAEC6BEEA6789DDC2AB51C7297A73957AC5CBEE7F4F8281EF6F47EDBDC83C366CDDAF087802082BE1620749754D05078F9EE4E71B4B6B5B3C6B999652F99F019B65468C632FC918C6840B63F801A49C5938F7BFCEB8EB913222A568CB2FE2F3E90911C1EAE9592F2811FD9E156068ABE18540542647D13A70D73F6DC5363A68426C3F9B1EC20FB29BB6920D784DF7724B31321A3CF9320CC657CA4044BB59AE4AFC4497FEC0DC032004183D5116F456A0C9A303E942EEEA6635A4E00C8DED8D6EAB67708682AC04FC18AB3CA1705C18E17DA9C6F06E2A0FDC905C88E3

and variable decoded["publickey_mod"] looks something like 010001

I am trying to encrypt a this password for https://steamcommunity.com/.


I have encrypted with this exact method using PHP before with a class called Math_BigInteger and this is how I made the publickey and encrypted the password:

$key = array(
    'n' => new Math_BigInteger($curl->response->publickey_mod,16),
    'e' => new Math_BigInteger($curl->response->publickey_exp,16)
);

// Define exponent
define('CRYPT_RSA_EXPONENT', 010001);

// Load the key
$rsa->loadKey($key)

// Set settings
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->setHash('sha256');

// Encrypt password
$encrypted_password = base64_encode($rsa->encrypt($password));

Help would be extremely appreciated, thanks in advance.

https://play.golang.org/p/wmkgu2_Q20

  • 写回答

1条回答 默认 最新

  • douweicheng5532 2016-04-06 12:18
    关注

    decoded["publickey_mod"] is a hex string, you need to convert it to a big.Int:

    publicKey.N, _ = new(big.Int).SetString(decoded["publickey_mod"].(string), 16 /* = base 16 */)
    // json numbers are float64 by default unless you use a struct and force a type
    publicKey.E = int(decoded["publickey_exp"].(float64))
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?