Guest User

Untitled

a guest
Jan 22nd, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func teaEncrypt(v [2]uint32, k [4]uint32) [2]uint32 {
  6. var v0, v1, sum uint32 = v[0], v[1], 0 /* set up */
  7. var delta uint32 = 0x9e3779b9 /* a key schedule constant */
  8. k0, k1, k2, k3 := k[0], k[1], k[2], k[3] /* cache key */
  9. for i := 0; i < 32; i++ { /* basic cycle start */
  10. sum += delta
  11. v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1)
  12. v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3)
  13. } /* end cycle */
  14. v[0] = v0
  15. v[1] = v1
  16. return v
  17. }
  18.  
  19. func teaDecrypt(v [2]uint32, k [4]uint32) [2]uint32 {
  20. var v0, v1, sum uint32 = v[0], v[1], 0xC6EF3720 /* set up */
  21. var delta uint32 = 0x9e3779b9 /* a key schedule constant */
  22. k0, k1, k2, k3 := k[0], k[1], k[2], k[3] /* cache key */
  23. for i := 0; i < 32; i++ { /* basic cycle start */
  24. v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3)
  25. v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1)
  26. sum -= delta
  27. } /* end cycle */
  28. v[0] = v0
  29. v[1] = v1
  30. return v
  31. }
  32.  
  33. func xteaEncrypt(rounds uint32, v [2]uint32, k [4]uint32) [2]uint32 { // encipher
  34. var v0, v1, sum, delta, i uint32 = v[0], v[1], 0, 0x9E3779B9, 0
  35. for ; i < rounds; i++ {
  36. v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum&3])
  37. sum += delta
  38. v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11)&3])
  39. }
  40. v[0] = v0
  41. v[1] = v1
  42. return v
  43. }
  44.  
  45. func xteaDecrypt(rounds uint32, v [2]uint32, k [4]uint32) [2]uint32 { //decipher
  46. var v0, v1, delta, sum, i uint32 = v[0], v[1], 0x9E3779B9, 0, 0
  47. sum = delta * rounds
  48. for ; i < rounds; i++ {
  49. v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11)&3])
  50. sum -= delta
  51. v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum&3])
  52. }
  53. v[0] = v0
  54. v[1] = v1
  55. return v
  56. }
  57.  
  58. func xxteaMX(z, y, sum uint32, key [4]uint32, p, e uint) uint32 {
  59. return (((z>>5 ^ y<<2) + (y>>3 ^ z<<4)) ^ ((sum ^ y) + (key[(p&3)^e] ^ z)))
  60. }
  61.  
  62. func xxtea(v []uint32, n int, k [4]uint32) { // btea
  63. var y, z, sum uint32
  64. var p, rounds, e uint
  65. var delta uint32 = 0x9e3779b9
  66. if n > 1 { /* Coding Part */
  67. rounds = uint(6 + 52/n)
  68. sum = 0
  69. z = v[n-1]
  70. for {
  71. sum += delta
  72. e = uint((sum >> 2) & 3)
  73. for p = 0; p < uint(n-1); p++ {
  74. y = v[p+1]
  75. v[p] += xxteaMX(z, y, sum, k, p, e)
  76. z = v[p]
  77. }
  78. y = v[0]
  79. v[n-1] += xxteaMX(z, y, sum, k, p, e)
  80. z = v[n-1]
  81. rounds--
  82. if rounds == 0 {
  83. break
  84. }
  85. }
  86. } else if n < -1 { /* Decoding Part */
  87. n = -n
  88. rounds = uint(6 + 52/n)
  89. sum = uint32(rounds) * delta
  90. y = v[0]
  91. for {
  92. e = uint((sum >> 2) & 3)
  93. for p = uint(n - 1); p > 0; p-- {
  94. z = v[p-1]
  95. v[p] -= xxteaMX(z, y, sum, k, p, e)
  96. y = v[p]
  97. }
  98. z = v[n-1]
  99. v[0] -= xxteaMX(z, y, sum, k, p, e)
  100. y = v[0]
  101. sum -= delta
  102. rounds--
  103. if rounds == 0 {
  104. break
  105. }
  106. }
  107. }
  108. }
  109.  
  110. func xxteaEncrypt(v []uint32, k [4]uint32) {
  111. xxtea(v, len(v), k)
  112. }
  113.  
  114. func xxteaDecrypt(v []uint32, k [4]uint32) {
  115. xxtea(v, -len(v), k)
  116. }
  117.  
  118. func main() {
  119. var v = [2]uint32{1, 2}
  120. var vv = [4]uint32{1, 2, 3, 4}
  121. var k = [4]uint32{2, 2, 3, 4}
  122. v = teaEncrypt(v, k)
  123. fmt.Println(v)
  124. v = teaDecrypt(v, k)
  125. fmt.Println(v)
  126. v = xteaEncrypt(32, v, k)
  127. fmt.Println(v)
  128. v = xteaDecrypt(32, v, k)
  129. fmt.Println(v)
  130. xxteaEncrypt(vv[:], k)
  131. fmt.Println(vv)
  132. xxteaDecrypt(vv[:], k)
  133. fmt.Println(vv)
  134. }
Add Comment
Please, Sign In to add comment