Skip to content

Instantly share code, notes, and snippets.

@hzj629206
Created January 22, 2019 05:49
Show Gist options
  • Save hzj629206/a29ec66a2fd97f947cdcdc7f262b2fad to your computer and use it in GitHub Desktop.
Save hzj629206/a29ec66a2fd97f947cdcdc7f262b2fad to your computer and use it in GitHub Desktop.
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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment