Go에서 Cipher Feedback 암호화 및 복호화

12797 단어 Gocrypto

CFB is



footnote


footnote

그냥 표준 가방으로 하고 싶어요.


프로그램 라이브러리

package crypto

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/base64"
    "errors"
    "io"
)

func encodeBase64(b []byte) string {
    return base64.StdEncoding.EncodeToString(b)
}

func decodeBase64(s string) []byte {
    data, err := base64.StdEncoding.DecodeString(s)
    if err != nil {
        panic(err)
    }
    return data
}

func Encrypt(key, text []byte) (string, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }
    b := base64.StdEncoding.EncodeToString(text)
    cipt := make([]byte, aes.BlockSize+len(b))
    iv := cipt[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }
    cfb := cipher.NewCFBEncrypter(block, iv)
    cfb.XORKeyStream(cipt[aes.BlockSize:], []byte(b))
    return encodeBase64(cipt), nil
}

func Decrypt(key []byte, t string) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    text := decodeBase64(t)
    if len(text) < aes.BlockSize {
        return nil, errors.New("too short")
    }
    iv := text[:aes.BlockSize]
    text = text[aes.BlockSize:]
    cfb := cipher.NewCFBDecrypter(block, iv)
    cfb.XORKeyStream(text, text)
    data, err := base64.StdEncoding.DecodeString(string(text))
    if err != nil {
        return nil, err
    }
    return data, nil
}

라이브러리 사용


encrypt

// keyは復号化用キーでもある。
enc, err := crypto.Encrypt([]byte(key), []byte(str))
    if err != nil {
        log.Fatalf("%+v", err)
    }
fmt.Println(enc)

decrypt

dec, err := crypto.Decrypt([]byte(key), enc)
    if err != nil {
        log.Fatalf("%+v", err)
    }
fmt.Println(string(dec))
CFB 모드를 자동 동기화 흐름 암호로 사용하기 위해서, 이 흐름 암호는 동기화를 유지할 수 있으며, x의 정수 배가 부족하더라도 블록 크기와 초기화 벡터 크기로 이동 레지스터를 초기화해야 한다.이것은 블록 암호화를 통해 암호화됩니다. 암호화 결과의 상위 x비트는 명문의 x비트의 XOR로 추출되고 이것은 x비트의 밀문이 됩니다.이 x비트의 출력은 다음 x비트의 명문 처리에 사용되는 위치 이동 레지스터로 이동됩니다.복호화도 마찬가지로 초기화 벡터부터 복호화, 복호화 결과의 상위 x비트와 밀문의 x비트의 XOR를 통해 x비트의 명문이 되어 다음 x비트의 밀문 처리에 사용된다.이러한 처리는 CFB-8 또는 CFB-1(이동량의 크기에 따라)
블록 암호화를 암호화 처리에만 사용하고 블록 크기의 정수 배에 메시지를 채울 필요가 없는 것이 장점입니다.
http://www.cs.shinshu-u.ac.jp/~okazaki/TECCRYP/SEC2/e3/e34.html  
https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89  

좋은 웹페이지 즐겨찾기