diff --git a/src/crypto/cipher/otp.go b/src/crypto/cipher/otp.go new file mode 100644 index 00000000000000..bacb5ef30272ea --- /dev/null +++ b/src/crypto/cipher/otp.go @@ -0,0 +1,30 @@ +package cipher + +import "crypto/rand" + +func KeyGen(message string) []byte { + key := make([]byte, len(message)) + + _, err := rand.Read(key) + if err != nil { + panic(err) + } + return key +} + +func OTPEncrypt(message string) (encrypted, key []byte) { + encrypted = make([]byte, len(message)) + key = KeyGen(message) + for i := 0; i < len(message); i++ { + encrypted[i] = message[i] ^ key[i] + } + return +} + +func OTPDecrypt(encrypted, key []byte) []byte { + decrypted := make([]byte, len(encrypted)) + for i := 0; i < len(encrypted); i++ { + decrypted[i] = encrypted[i] ^ key[i] + } + return decrypted +} diff --git a/src/crypto/cipher/otp_test.go b/src/crypto/cipher/otp_test.go new file mode 100644 index 00000000000000..c810fe874f6753 --- /dev/null +++ b/src/crypto/cipher/otp_test.go @@ -0,0 +1,16 @@ +package cipher + +import ( + "bytes" + "testing" +) + +func TestOTP(t *testing.T) { + msg := []byte("Hello OTP!") + ciphertext, key := OTPEncrypt(string(msg)) + decrypted := OTPDecrypt(ciphertext, key) + + if !bytes.Equal([]byte(decrypted), msg) { + t.Errorf("Decrypted message does not match original") + } +}