Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import "fmt"
- func teaEncrypt(v [2]uint32, k [4]uint32) [2]uint32 {
- var v0, v1, sum uint32 = v[0], v[1], 0 /* set up */
- var delta uint32 = 0x9e3779b9 /* a key schedule constant */
- k0, k1, k2, k3 := k[0], k[1], k[2], k[3] /* cache key */
- for i := 0; i < 32; i++ { /* basic cycle start */
- sum += delta
- v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1)
- v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3)
- } /* end cycle */
- v[0] = v0
- v[1] = v1
- return v
- }
- func teaDecrypt(v [2]uint32, k [4]uint32) [2]uint32 {
- var v0, v1, sum uint32 = v[0], v[1], 0xC6EF3720 /* set up */
- var delta uint32 = 0x9e3779b9 /* a key schedule constant */
- k0, k1, k2, k3 := k[0], k[1], k[2], k[3] /* cache key */
- for i := 0; i < 32; i++ { /* basic cycle start */
- v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3)
- v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1)
- sum -= delta
- } /* end cycle */
- v[0] = v0
- v[1] = v1
- return v
- }
- func xteaEncrypt(rounds uint32, v [2]uint32, k [4]uint32) [2]uint32 { // encipher
- var v0, v1, sum, delta, i uint32 = v[0], v[1], 0, 0x9E3779B9, 0
- for ; i < rounds; i++ {
- v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum&3])
- sum += delta
- v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11)&3])
- }
- v[0] = v0
- v[1] = v1
- return v
- }
- func xteaDecrypt(rounds uint32, v [2]uint32, k [4]uint32) [2]uint32 { //decipher
- var v0, v1, delta, sum, i uint32 = v[0], v[1], 0x9E3779B9, 0, 0
- sum = delta * rounds
- for ; i < rounds; i++ {
- v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11)&3])
- sum -= delta
- v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum&3])
- }
- v[0] = v0
- v[1] = v1
- return v
- }
- func xxteaMX(z, y, sum uint32, key [4]uint32, p, e uint) uint32 {
- return (((z>>5 ^ y<<2) + (y>>3 ^ z<<4)) ^ ((sum ^ y) + (key[(p&3)^e] ^ z)))
- }
- func xxtea(v []uint32, n int, k [4]uint32) { // btea
- var y, z, sum uint32
- var p, rounds, e uint
- var delta uint32 = 0x9e3779b9
- if n > 1 { /* Coding Part */
- rounds = uint(6 + 52/n)
- sum = 0
- z = v[n-1]
- for {
- sum += delta
- e = uint((sum >> 2) & 3)
- for p = 0; p < uint(n-1); p++ {
- y = v[p+1]
- v[p] += xxteaMX(z, y, sum, k, p, e)
- z = v[p]
- }
- y = v[0]
- v[n-1] += xxteaMX(z, y, sum, k, p, e)
- z = v[n-1]
- rounds--
- if rounds == 0 {
- break
- }
- }
- } else if n < -1 { /* Decoding Part */
- n = -n
- rounds = uint(6 + 52/n)
- sum = uint32(rounds) * delta
- y = v[0]
- for {
- e = uint((sum >> 2) & 3)
- for p = uint(n - 1); p > 0; p-- {
- z = v[p-1]
- v[p] -= xxteaMX(z, y, sum, k, p, e)
- y = v[p]
- }
- z = v[n-1]
- v[0] -= xxteaMX(z, y, sum, k, p, e)
- y = v[0]
- sum -= delta
- rounds--
- if rounds == 0 {
- break
- }
- }
- }
- }
- func xxteaEncrypt(v []uint32, k [4]uint32) {
- xxtea(v, len(v), k)
- }
- func xxteaDecrypt(v []uint32, k [4]uint32) {
- xxtea(v, -len(v), k)
- }
- func main() {
- var v = [2]uint32{1, 2}
- var vv = [4]uint32{1, 2, 3, 4}
- var k = [4]uint32{2, 2, 3, 4}
- v = teaEncrypt(v, k)
- fmt.Println(v)
- v = teaDecrypt(v, k)
- fmt.Println(v)
- v = xteaEncrypt(32, v, k)
- fmt.Println(v)
- v = xteaDecrypt(32, v, k)
- fmt.Println(v)
- xxteaEncrypt(vv[:], k)
- fmt.Println(vv)
- xxteaDecrypt(vv[:], k)
- fmt.Println(vv)
- }
Add Comment
Please, Sign In to add comment