Go国密sm 2 sm 3 sm 4


本文は個人の学習研究に供するだけで、権利侵害にかかわる場合は、お知らせください.
国密
SM 1は対称暗号化である.その暗号化強度はAESに相当する.このアルゴリズムは公開されていないが,このアルゴリズムを呼び出す際には暗号化チップのインタフェースで呼び出す必要がある.
SM 2はECCベースの非対称暗号化である.このアルゴリズムは公開されている.このアルゴリズムはECCに基づいているため,署名速度と鍵生成速度ともにRSAよりも速い.ECC 256ビット(SM 2はECC 256ビットの一種)のセキュリティ強度はRSA 2048ビットより高いが、演算速度はRSAより速い.
SM 3メッセージの概要.MD 5を比較として理解できる.このアルゴリズムは公開されている.チェック結果は256ビットです.
SM 4無線LAN標準のパケットデータアルゴリズム.対称暗号化、鍵長、パケット長は128ビットです.
国産暗号アルゴリズム(国密アルゴリズム)とは、国家暗号局が認定した国産商用暗号アルゴリズムであり、金融分野では現在主に公開されているSM 2、SM 3、SM 4の3種類のアルゴリズムが使用されており、それぞれ非対称アルゴリズム、ハッシュアルゴリズム、対称アルゴリズムである.
SM2
SM 2アルゴリズム:SM 2楕円曲線公開鍵暗号アルゴリズムは中国が自主的に設計した公開鍵暗号アルゴリズムであり、SM 2-1楕円曲線デジタル署名アルゴリズム、SM 2-2楕円曲線鍵交換プロトコル、SM 2-3楕円曲線公開鍵暗号化アルゴリズムを含み、それぞれデジタル署名鍵協議とデータ暗号化などの機能を実現するために用いられる.SM 2アルゴリズムはRSAアルゴリズムと異なり,SM 2アルゴリズムは楕円曲線上の点群離散対数に基づく難題であり,256ビットのSM 2暗号強度はRSAアルゴリズムに比べて2048ビットのRSA暗号強度よりも高かった.
SM3
SM 3アルゴリズム:SM 3コンパクトアルゴリズムは中国が自主的に設計した暗号コンパクトアルゴリズムであり、商用暗号アプリケーションにおけるデジタル署名と検証メッセージ認証コードの生成と検証及び乱数の生成に適用され、多種の暗号アプリケーションの安全需要を満たすことができる.コンパクトアルゴリズムの安全性を保証するために、生成されたコンパクト値の長さは、例えばMD 5が128ビットのコンパクト値を出力し、出力長が短すぎて、その安全性に影響するSHA−1アルゴリズムの出力長さが160ビット、SM 3アルゴリズムの出力長さが256ビットであるため、SM 3アルゴリズムの安全性はMD 5アルゴリズムおよびSHA−1アルゴリズムよりも高い.
SM4
SM 4アルゴリズム:SM 4パケット暗号アルゴリズムは中国が自主的に設計したパケット対称暗号アルゴリズムであり、データの暗号化/復号演算を実現し、データと情報の機密性を保証するために使用される.対称暗号アルゴリズムのセキュリティを保証する基本条件は、十分な鍵長を有することであり、SM 4アルゴリズムはAESアルゴリズムと同じ鍵長パケット長128ビットを有するため、セキュリティ上3 DESアルゴリズムよりも高い.
Go言語による国密実現
Go言語は国密を実現し、サードパーティのライブラリに依存する.ここでは、Go言語に基づく国密SM 2/SM 3/SM 4暗号化アルゴリズムライブラリ、GitHubアドレスを紹介する.https://github.com/tjfoc/gmsm
インストール:
go get -u github.com/tjfoc/gmsm

SM2
メソッドのリスト:
  • GenerateKey

  • ランダム鍵を生成します.
    func GenerateKey() (*PrivateKey, error) 
    
  • Sign

  • 秘密鍵でデータに署名し、2つの大きな数で表される署名結果を正常に返します.そうしないと、エラーが返されます.
    func Sign(priv *PrivateKey, hash []byte) (r, s *big.Int, err error)
    
  • Verify

  • 公開鍵でデータ署名を検証し、検証に成功してTrueを返します.そうでなければFalseを返します.
    func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool 
    
  • Encrypt

  • 公開鍵でデータを暗号化し、暗号化エラーを正常に返します.そうしないと、エラーが返されます.
    func Encrypt(pub *PublicKey, data []byte) ([]byte, error) 
    
  • Decrypt

  • 秘密鍵でデータを復号し、元の明文データを正常に返します.そうしないと、エラーが返されます.
    func Decrypt(priv *PrivateKey, data []byte) ([]byte, error)
    

    例:
    
    func main() {
    	priv, err := sm2.GenerateKey() //      
    	if err != nil {
    		log.Fatal(err)
    	}
    	msg := []byte("Tongji Fintech Research Institute")
    	pub := &priv.PublicKey
    	ciphertxt, err := pub.Encrypt(msg)
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Printf("    :%x
    ",ciphertxt) plaintxt,err := priv.Decrypt(ciphertxt) if err != nil { log.Fatal(err) } if !bytes.Equal(msg,plaintxt){ log.Fatal(" ") } r,s,err := sm2.Sign(priv, msg) if err != nil { log.Fatal(err) } isok := sm2.Verify(pub,msg,r,s) fmt.Printf("Verified: %v
    ", isok) }

    SM3
    メソッドのリスト:
  • New

  • ハッシュ計算インスタンスの作成
    func New() hash.Hash 
    
  • Sum

  • SM 3ハッシュアルゴリズムの要約値を返します
    func Sum() []byte 
    

    例:
    func main() {
    	data := "test"
    	h := sm3.New()
    	h.Write([]byte(data))
    	sum := h.Sum(nil)
    	fmt.Printf("digest value is: %x
    ",sum) }

    SM4
    メソッドのリスト:
  • NewCipher

  • SM 4暗号パケットアルゴリズムモデルを作成し、パラメータkey長は128ビットのみをサポートします.
    func NewCipher(key []byte) (cipher.Block, error)
    

    例:
    func main(){
            // 128    
            key := []byte("1234567890abcdef")
            // 128  iv
            iv := make([]byte, sm4.BlockSize)
            data := []byte("Tongji Fintech Research Institute")
            ciphertxt,err := sm4Encrypt(key,iv, data)
            if err != nil{
                log.Fatal(err)
            }
            fmt.Printf("    : %x
    ", ciphertxt) } func sm4Encrypt(key, iv, plainText []byte) ([]byte, error) { block, err := sm4.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() origData := pkcs5Padding(plainText, blockSize) blockMode := cipher.NewCBCEncrypter(block, iv) cryted := make([]byte, len(origData)) blockMode.CryptBlocks(cryted, origData) return cryted, nil } func sm4Decrypt(key, iv, cipherText []byte) ([]byte, error) { block, err := sm4.NewCipher(key) if err != nil { return nil, err } blockMode := cipher.NewCBCDecrypter(block, iv) origData := make([]byte, len(cipherText)) blockMode.CryptBlocks(origData, cipherText) origData = pkcs5UnPadding(origData) return origData, nil } // pkcs5 func pkcs5Padding(src []byte, blockSize int) []byte { padding := blockSize - len(src)%blockSize padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(src, padtext...) } func pkcs5UnPadding(src []byte) []byte { length := len(src) unpadding := int(src[length-1]) return src[:(length - unpadding)] }

    まとめ
    サードパーティ製ライブラリを使用すると、Go言語の暗号化の問題を解決できます.