2013-01-18 11 views
8

RSA鍵ペアを使用してプレーンテキストファイルを暗号化および復号化するユーティリティプログラムを作成しようとしています。 RSA鍵はssh-keygenで生成され、通常どおり.sshに格納されます。GoでRSAキーを使用してプレーンテキストを暗号化および復号化するにはどうすればよいですか?

Go言語の暗号とcrypto/rsaパッケージでどうすればよいのか分かりませんか?これらのドキュメントは少し疎であり(暗号化を初めて使用しているため)、非常に少数の例があります。私はrsa_test.goファイルに手がかりをつけましたが、もっと混乱してしまいました。

要するに、.sshのid_rsaとid_rsa.pubファイルから公開鍵/秘密鍵のペアを読み込み、プレーンテキストファイルの暗号化/復号化に使用しようとしています。

ありがとうございます!

+1

私は、HTTP(あなたは[こちら]パッケージテストからいくつかのインスピレーションを得るかもしれないと思います://golang.org/src/pkg/crypto/rsa/pkcs1v15_test.go)および/または[there](http://golang.org/src/pkg/crypto/rsa/rsa_test.go)を参照してください。 – zzzz

+0

参照:http://unix.stackexchange.com/a/30074/22709およびhttps://web.archive.org/web/20120124211352/http://blog.oddbit.com/2011/05/converting- openssh-public-keys.html –

答えて

13

RSAはブロック暗号ではありません。通常、RSAはデータを暗号化するために使用される対称鍵を暗号化するために使用されます。このことを念頭に置いて、しかし、ここではそれ自体で復号化することができ、データを暗号化するために、RSA秘密鍵を使用することができますプログラムは、次のとおりです。

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

公開鍵で暗号化しないでください。 – Aliza

+0

@Aliza暗号化は公開鍵で行われます。 'if * decrypt'ブロックの' else'節を参照してください。 'EncryptOEAP'はキーペアの公開半分である'&priv.PublicKey'をとります。 –

関連する問題