2013-01-18 47 views
8

Tôi đang cố gắng viết chương trình tiện ích mã hóa và giải mã các tệp văn bản thuần túy bằng cặp khóa RSA. Các khóa RSA được tạo bằng ssh-keygen và được lưu trữ trong .ssh, như thường lệ.Làm thế nào để mã hóa và giải mã văn bản thuần tuý bằng khóa RSA trong Go?

Tôi gặp sự cố khi hiểu cách thực hiện điều đó bằng gói mật mã và gói mật mã và gói ngôn ngữ Go? Các tài liệu về những người là một chút thưa thớt (thậm chí nhiều hơn như vậy bởi vì tôi mới để mã hóa) và có rất ít ví dụ. Tôi đã kiểm tra tập tin rsa_test.go cho bất kỳ manh mối nào, nhưng nó chỉ làm tôi bối rối hơn.

Tóm lại, tôi đang cố tải cặp khóa công khai/riêng tư từ tệp id_rsa và id_rsa.pub vào .ssh và sử dụng chúng để mã hóa/giải mã tệp văn bản thuần túy.

Cảm ơn bạn trước!

+1

Tôi nghĩ bạn có thể lấy cảm hứng từ các bài kiểm tra gói [tại đây] (http) : //golang.org/src/pkg/crypto/rsa/pkcs1v15_test.go) và/hoặc [có] (http://golang.org/src/pkg/crypto/rsa/rsa_test.go). – zzzz

+0

Xem thêm: http://unix.stackexchange.com/a/30074/22709 và https://web.archive.org/web/20120124211352/http://blog.oddbit.com/2011/05/converting- openssh-public-keys.html –

Trả lời

13

Hãy nhớ rằng RSA không được thiết kế để trở thành một mật mã khối. Thông thường RSA được sử dụng để mã hóa một khóa đối xứng sau đó được sử dụng để mã hóa dữ liệu. Tuy nhiên, với ý nghĩ đó, đây là một chương trình có thể sử dụng khóa riêng RSA để mã hóa dữ liệu có thể được giải mã bằng chính nó:

package main 

import (
    "crypto/rand" 
    "crypto/rsa" 
    "crypto/sha1" 
    "crypto/x509" 
    "encoding/pem" 
    "flag" 
    "io/ioutil" 
    "log" 
) 

// Command-line flags 
var (
    keyFile = flag.String("key", "id_rsa", "Path to RSA private key") 
    inFile = flag.String("in", "in.txt", "Path to input file") 
    outFile = flag.String("out", "out.txt", "Path to output file") 
    label = flag.String("label", "", "Label to use (filename by default)") 
    decrypt = flag.Bool("decrypt", false, "Decrypt instead of encrypting") 
) 

func main() { 
    flag.Parse() 

    // Read the input file 
    in, err := ioutil.ReadFile(*inFile) 
    if err != nil { 
     log.Fatalf("input file: %s", err) 
    } 

    // Read the private key 
    pemData, err := ioutil.ReadFile(*keyFile) 
    if err != nil { 
     log.Fatalf("read key file: %s", err) 
    } 

    // Extract the PEM-encoded data block 
    block, _ := pem.Decode(pemData) 
    if block == nil { 
     log.Fatalf("bad key data: %s", "not PEM-encoded") 
    } 
    if got, want := block.Type, "RSA PRIVATE KEY"; got != want { 
     log.Fatalf("unknown key type %q, want %q", got, want) 
    } 

    // Decode the RSA private key 
    priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) 
    if err != nil { 
     log.Fatalf("bad private key: %s", err) 
    } 

    var out []byte 
    if *decrypt { 
     if *label == "" { 
      *label = *outFile 
     } 
     // Decrypt the data 
     out, err = rsa.DecryptOAEP(sha1.New(), rand.Reader, priv, in, []byte(*label)) 
     if err != nil { 
      log.Fatalf("decrypt: %s", err) 
     } 
    } else { 
     if *label == "" { 
      *label = *inFile 
     } 
     out, err = rsa.EncryptOAEP(sha1.New(), rand.Reader, &priv.PublicKey, in, []byte(*label)) 
     if err != nil { 
      log.Fatalf("encrypt: %s", err) 
     } 
    } 

    // Write data to output file 
    if err := ioutil.WriteFile(*outFile, out, 0600); err != nil { 
     log.Fatalf("write output: %s", err) 
    } 
} 
+0

không nên mã hóa bằng khóa công khai? – Aliza

+0

@Aliza Mã hóa được thực hiện bằng khóa công cộng. Xem mệnh đề 'else' của khối' if * decrypt' - 'EncryptOEAP' nhận' & priv.PublicKey' là nửa công khai của cặp khóa. –

Các vấn đề liên quan