Использование API Go от Государственного управления шифрования КНР (国密GM/T Go API使用说明)
Установка пакета Go
go get -u github.com/Hyperledger-TWGC/tjfoc-gm
SM3 алгоритм хеширования — SM3 cryptographic hash algorithm
github.com/Hyperledger-TWGC/tjfoc-gm/sm3
.SM3 struct
является реализацией интерфейса hash.Hash
. data := "test"
h := sm3.New()
h.Write([]byte(data))
sum := h.Sum(nil)
fmt.Printf("digest value is: %x\n",sum)
Алгоритм блочного шифрования SM4 — SM4 block cipher algorithm
github.com/Hyperledger-TWGC/tjfoc-gm/sm4
. import "crypto/cipher"
import "github.com/Hyperledger-TWGC/tjfoc-gm/sm4"
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\n", 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)
if(length==0){
return nil
}
unpadding := int(src[length-1])
return src[:(length - unpadding)]
}
Создаёт модель алгоритма SM4 блочного шифрования, длина ключа должна быть 128 бит.
func NewCipher(key []byte) (cipher.Block, error)
Схемы цифровой подписи SM2 на основе эллиптических кривых — Public key cryptographic algorithm SM2 based on elliptic curves
github.com/Hyperledger-TWGC/tjfoc-gm/sm2
. 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\n",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\n", isok)
Генерирует случайный закрытый ключ.
func GenerateKey() (*PrivateKey, error)
Подписывает данные с помощью закрытого ключа, в случае успеха возвращает два больших числа, представляющих подпись, иначе возвращает ошибку.
func Sign(priv *PrivateKey, hash []byte) (r, s *big.Int, err error)
Проверяет данные с помощью открытого ключа, проверка успешна, если возвращается True, иначе False.
func Verify(pub *PublicKey, hash []byte, r, s *big.Int) bool
Шифрует данные с использованием открытого ключа, успешно возвращает зашифрованный текст, иначе возвращает ошибку.
func Encrypt(pub *PublicKey, data []byte) ([]byte, error)
Расшифровывает данные с использованием закрытого ключа, успешно возвращает исходный открытый текст, иначе возвращает ошибку.
func Decrypt(priv *PrivateKey, data []byte) ([]byte, error)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )