Go에서 Cipher Feedback 암호화 및 복호화
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 ↩
Reference
이 문제에 관하여(Go에서 Cipher Feedback 암호화 및 복호화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/HirokiKobayashi/items/29124e9d1c2026948ac9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
프로그램 라이브러리
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 ↩
Reference
이 문제에 관하여(Go에서 Cipher Feedback 암호화 및 복호화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/HirokiKobayashi/items/29124e9d1c2026948ac9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// keyは復号化用キーでもある。
enc, err := crypto.Encrypt([]byte(key), []byte(str))
if err != nil {
log.Fatalf("%+v", err)
}
fmt.Println(enc)
dec, err := crypto.Decrypt([]byte(key), enc)
if err != nil {
log.Fatalf("%+v", err)
}
fmt.Println(string(dec))
Reference
이 문제에 관하여(Go에서 Cipher Feedback 암호화 및 복호화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/HirokiKobayashi/items/29124e9d1c2026948ac9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)