2016-12-13 9 views
1

Я видел много примеров того, как преобразовать X.509 в модуль экспоненты, но я не видел обратного.Go Язык Преобразовать модуль в индекс X.509

значения У меня есть с моей ключевой конечной точке выглядеть следующим образом:

{"keys": [{"alg":"RS256","e":"AQAB","n":"ok6rvXu95337IxsDXrKzlIqw_I_zPDG8JyEw2CTOtNMoDi1QzpXQVMGj2snNEmvNYaCTmFf51I-EDgeFLLexr40jzBXlg72quV4aw4yiNuxkigW0gMA92OmaT2jMRIdDZM8mVokoxyPfLub2YnXHFq0XuUUgkX_TlutVhgGbyPN0M12teYZtMYo2AUzIRggONhHvnibHP0CPWDjCwSfp3On1Recn4DPxbn3DuGslF2myalmCtkujNcrhHLhwYPP-yZFb8e0XSNTcQvXaQxAqmnWH6NXcOtaeWMQe43PNTAyNinhndgI8ozG3Hz-1NzHssDH_yk6UYFSszhDbWAzyqw","kid":"wyMwK4A6CL9Qw11uofVeyQ119XyX-xykymkkXygZ5OM","kty":"RSA","use":"sig"},{"alg":"RS256","e":"AQAB","n":"nXv6FSAcMjuanQ2hIIUb8Vkqe94t98kPh2T8-0j6-Jq8pOclgKdtVeIZcBE9F_XiuJvg4b6WVs-uvA-pS8mmMvQ21xU5Q_37Cojv8v_QlHWETHwEJdXXiY2Xq5LgXDSwEhhdDZHSMQYDuvhp_P6nl2LNqqUvJkjoFWcnn2btgSIUQROIaDdxtx7_2h4oUi5u11BGSF2SZZiEpDAKT08Htv3uwXdwDA6ll99fbi8X8RmH5oY_tIZTeIzu50qHxElPewoYO8QrJYsO9oFcCPMHGxYWjXQEa-QZYgo0wS9zRIkeJc5kshc4-9Uhv2DVIjk_-ofGlML9ieggGyillBKptw","kid":"GRF55Lbzgg4sANCmER-sm55eX_qUOpY8UTptDmDG_6U","kty":"RSA","use":"sig"}]} 

Я думаю, что это ключ:

ok6rvXu95337IxsDXrKzlIqw_I_zPDG8JyEw2CTOtNMoDi1QzpXQVMGj2snNEmvNYaCTmFf51I-EDgeFLLexr40jzBXlg72quV4aw4yiNuxkigW0gMA92OmaT2jMRIdDZM8mVokoxyPfLub2YnXHFq0XuUUgkX_TlutVhgGbyPN0M12teYZtMYo2AUzIRggONhHvnibHP0CPWDjCwSfp3On1Recn4DPxbn3DuGslF2myalmCtkujNcrhHLhwYPP-yZFb8e0XSNTcQvXaQxAqmnWH6NXcOtaeWMQe43PNTAyNinhndgI8ozG3Hz-1NzHssDH_yk6UYFSszhDbWAzyqw 

var key = "ok6rvXu95337IxsDXrKzlIqw_I_zPDG8JyEw2CTOtNMoDi1QzpXQVMGj2snNEmvNYaCTmFf51I-EDgeFLLexr40jzBXlg72quV4aw4yiNuxkigW0gMA92OmaT2jMRIdDZM8mVokoxyPfLub2YnXHFq0XuUUgkX_TlutVhgGbyPN0M12teYZtMYo2AUzIRggONhHvnibHP0CPWDjCwSfp3On1Recn4DPxbn3DuGslF2myalmCtkujNcrhHLhwYPP-yZFb8e0XSNTcQvXaQxAqmnWH6NXcOtaeWMQe43PNTAyNinhndgI8ozG3Hz-1NzHssDH_yk6UYFSszhDbWAzyqw" 

Если кто-то может мне точку в правильном направлении, чтобы сделать это в язык GO был бы оценен. Я также поставлю его на площадку Go Lang, чтобы другие могли ее использовать.

+0

Вы можете загрузить значения непосредственно в [ 'rsa.PublicKey '] (https://golang.org/pkg/crypto/rsa/#PublicKey). В каком формате нужен ключ? – JimB

+0

Благодарим за вопрос. Я пытаюсь преобразовать в формат .pem как этот – user3888307

+0

----- НАЧАТЬ PUBLIC KEY ----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfu6fJMNQNy13wCYvlIuKPBfBt BHgeAeUbrn4JVmuAJGnQ2i08RizbWPzbckWQX8IXQJkYykCU1YJ + Y98tLPo/276c zJLaFXhwe4qzocQ52SXSMTTTGN51CgYEAfNY4PJTU3gayahC0iYkV0CHuT8liVsE CdV67X0DXMBpCAjNSwIDAQAB ----- END PUBLIC KEY --- - – user3888307

ответ

0

Вы можете поместить значения непосредственно в rsa.PublicKey, который может быть использован как есть. Поскольку вы хотите кодировать это как pem, закодированный x.509, вы можете использовать функцию x509.MarshalPKIXPublicKey для маршалирования блока der и кодировать ее с помощью пакета pem.

После демаршалинга первый ключ в вашем примере, чтобы jwk:

// decode the base64 bytes for n 
nb, err := base64.RawURLEncoding.DecodeString(jwk["n"]) 
if err != nil { 
    log.Fatal(err) 
} 

e := 65537 
// The default exponent is usually 65537, so just compare the 
// base64 for [1,0,1] or [0,1,0,1] 
if jwk["e"] != "AQAB" && jwk["e"] != "AAEAAQ" { 
    // still need to decode the big-endian int 
    log.Fatal("need to deocde e:", jwk["e"]) 
} 

pk := &rsa.PublicKey{ 
    N: new(big.Int).SetBytes(nb), 
    E: e, 
} 

der, err := x509.MarshalPKIXPublicKey(pk) 
if err != nil { 
    log.Fatal(err) 
} 

block := &pem.Block{ 
    Type: "RSA PUBLIC KEY", 
    Bytes: der, 
} 

var out bytes.Buffer 
pem.Encode(&out, block) 
fmt.Println(out.String()) 

Что будет:

-----BEGIN RSA PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAok6rvXu95337IxsDXrKz 
lIqw/I/zPDG8JyEw2CTOtNMoDi1QzpXQVMGj2snNEmvNYaCTmFf51I+EDgeFLLex 
r40jzBXlg72quV4aw4yiNuxkigW0gMA92OmaT2jMRIdDZM8mVokoxyPfLub2YnXH 
Fq0XuUUgkX/TlutVhgGbyPN0M12teYZtMYo2AUzIRggONhHvnibHP0CPWDjCwSfp 
3On1Recn4DPxbn3DuGslF2myalmCtkujNcrhHLhwYPP+yZFb8e0XSNTcQvXaQxAq 
mnWH6NXcOtaeWMQe43PNTAyNinhndgI8ozG3Hz+1NzHssDH/yk6UYFSszhDbWAzy 
qwIDAQAB 
-----END RSA PUBLIC KEY----- 

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

+0

Я пытался реализовать аналогичную функцию в lua. Существует небольшая разница между ключом, сгенерированным моим кодом и кодом GoLang. Ключ, созданный вашим кодом, работал для меня. Можете ли вы ссылаться на эту ссылку и сообщить мне, чего я пропустил, я, наверное, должен добавить OID в свой код, похожий на реализацию GoLang, но опять же не уверен, как преобразовать ASN.1 в ASCII в lua. Я буду обновлять свой код на основе ваших данных. Спасибо https://stackoverflow.com/questions/44791186/how-can-i-fix-this-code-to-get-similar-output-as-golang-function?noredirect=1#comment76563822_44791186 –

 Смежные вопросы

  • Нет связанных вопросов^_^