英文:
Go - How to Set RSA PublicKey Modulus from String?
问题
我正在尝试使用Go的RSA包对密码进行加密。
以下是我目前的代码:
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)
// 获取RSA密钥
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("无法获取RSA密钥。")
}
// 设置加密变量
var privateKey *rsa.PrivateKey
var publicKey *rsa.PublicKey
var plain_text, encrypted []byte
plain_text = []byte(password)
// 生成私钥
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) // <- 这样不对,我需要从publickey_mod字符串创建一个大整数(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加密 [%s] 为 \n[%x]\n", string(plain_text), encrypted)
return nil
}
我无法将publicKey.N的值设置为给定字符串的big.Int类型。
变量decoded["publickey_mod"]
看起来像这样:
D3ABCD8303F887E0C7B390E088F24A797FE7084555FFB8BCE21F25EDD1F0DD02F48743EBAEC6BEEA6789DDC2AB51C7297A73957AC5CBEE7F4F8281EF6F47EDBDC83C366CDDAF087802082BE1620749754D05078F9EE4E71B4B6B5B3C6B999652F99F019B65468C632FC918C6840B63F801A49C5938F7BFCEB8EB913222A568CB2FE2F3E90911C1EAE9592F2811FD9E156068ABE18540542647D13A70D73F6DC5363A68426C3F9B1EC20FB29BB6920D784DF7724B31321A3CF9320CC657CA4044BB59AE4AFC4497FEC0DC032004183D5116F456A0C9A303E942EEEA6635A4E00C8DED8D6EAB67708682AC04FC18AB3CA1705C18E17DA9C6F06E2A0FDC905C88E3
而变量decoded["publickey_mod"]
看起来像010001
我正在尝试为https://steamcommunity.com/加密这个密码。
我以前使用PHP使用名为Math_BigInteger的类使用相同的方法进行加密,以下是我创建publickey和加密密码的方式:
$key = array(
'n' => new Math_BigInteger($curl->response->publickey_mod,16),
'e' => new Math_BigInteger($curl->response->publickey_exp,16)
);
// 定义指数
define('CRYPT_RSA_EXPONENT', 010001);
// 加载密钥
$rsa->loadKey($key)
// 设置参数
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->setHash('sha256');
// 加密密码
$encrypted_password = base64_encode($rsa->encrypt($password));
非常感谢您的帮助。
英文:
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 \n[%x]\n", 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.
答案1
得分: 1
decoded["publickey_mod"]
是一个十六进制字符串,你需要将它转换为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))
英文:
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))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论