Created
January 22, 2019 05:46
-
-
Save hzj629206/7e0b805c8018a1b95903b20af2933e5c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
func skip32Encrypt(number uint32, key string) uint32 { | |
return skip32(number, key, true) | |
} | |
func skip32Decrypt(number uint32, key string) uint32 { | |
return skip32(number, key, false) | |
} | |
var _SKIP32_FTABLE = [256]byte{ | |
0xa3, 0xd7, 0x09, 0x83, 0xf8, 0x48, | |
0xf6, 0xf4, 0xb3, 0x21, 0x15, 0x78, 0x99, 0xb1, 0xaf, 0xf9, 0xe7, | |
0x2d, 0x4d, 0x8a, 0xce, 0x4c, 0xca, 0x2e, 0x52, 0x95, 0xd9, 0x1e, | |
0x4e, 0x38, 0x44, 0x28, 0x0a, 0xdf, 0x02, 0xa0, 0x17, 0xf1, 0x60, | |
0x68, 0x12, 0xb7, 0x7a, 0xc3, 0xe9, 0xfa, 0x3d, 0x53, 0x96, 0x84, | |
0x6b, 0xba, 0xf2, 0x63, 0x9a, 0x19, 0x7c, 0xae, 0xe5, 0xf5, 0xf7, | |
0x16, 0x6a, 0xa2, 0x39, 0xb6, 0x7b, 0x0f, 0xc1, 0x93, 0x81, 0x1b, | |
0xee, 0xb4, 0x1a, 0xea, 0xd0, 0x91, 0x2f, 0xb8, 0x55, 0xb9, 0xda, | |
0x85, 0x3f, 0x41, 0xbf, 0xe0, 0x5a, 0x58, 0x80, 0x5f, 0x66, 0x0b, | |
0xd8, 0x90, 0x35, 0xd5, 0xc0, 0xa7, 0x33, 0x06, 0x65, 0x69, 0x45, | |
0x00, 0x94, 0x56, 0x6d, 0x98, 0x9b, 0x76, 0x97, 0xfc, 0xb2, 0xc2, | |
0xb0, 0xfe, 0xdb, 0x20, 0xe1, 0xeb, 0xd6, 0xe4, 0xdd, 0x47, 0x4a, | |
0x1d, 0x42, 0xed, 0x9e, 0x6e, 0x49, 0x3c, 0xcd, 0x43, 0x27, 0xd2, | |
0x07, 0xd4, 0xde, 0xc7, 0x67, 0x18, 0x89, 0xcb, 0x30, 0x1f, 0x8d, | |
0xc6, 0x8f, 0xaa, 0xc8, 0x74, 0xdc, 0xc9, 0x5d, 0x5c, 0x31, 0xa4, | |
0x70, 0x88, 0x61, 0x2c, 0x9f, 0x0d, 0x2b, 0x87, 0x50, 0x82, 0x54, | |
0x64, 0x26, 0x7d, 0x03, 0x40, 0x34, 0x4b, 0x1c, 0x73, 0xd1, 0xc4, | |
0xfd, 0x3b, 0xcc, 0xfb, 0x7f, 0xab, 0xe6, 0x3e, 0x5b, 0xa5, 0xad, | |
0x04, 0x23, 0x9c, 0x14, 0x51, 0x22, 0xf0, 0x29, 0x79, 0x71, 0x7e, | |
0xff, 0x8c, 0x0e, 0xe2, 0x0c, 0xef, 0xbc, 0x72, 0x75, 0x6f, 0x37, | |
0xa1, 0xec, 0xd3, 0x8e, 0x62, 0x8b, 0x86, 0x10, 0xe8, 0x08, 0x77, | |
0x11, 0xbe, 0x92, 0x4f, 0x24, 0xc5, 0x32, 0x36, 0x9d, 0xcf, 0xf3, | |
0xa6, 0xbb, 0xac, 0x5e, 0x6c, 0xa9, 0x13, 0x57, 0x25, 0xb5, 0xe3, | |
0xbd, 0xa8, 0x3a, 0x01, 0x05, 0x59, 0x2a, 0x46, | |
} | |
func _skip32_g(key []byte, k uint32, w uint32) uint32 { | |
g1 := w >> 8 | |
g2 := w & 0xFF | |
g3 := (uint32(_SKIP32_FTABLE[g2^uint32(key[(4*k)%10]&0xFF)])) ^ g1 | |
g4 := (uint32(_SKIP32_FTABLE[g3^uint32(key[(4*k+1)%10]&0xFF)])) ^ g2 | |
g5 := (uint32(_SKIP32_FTABLE[g4^uint32(key[(4*k+2)%10]&0xFF)])) ^ g3 | |
g6 := (uint32(_SKIP32_FTABLE[g5^uint32(key[(4*k+3)%10]&0xFF)])) ^ g4 | |
return (g5 << 8) + g6 | |
} | |
func skip32(value uint32, key string, encypt bool) uint32 { | |
buf := [...]uint32{ | |
((value >> 24) & 0xff), | |
((value >> 16) & 0xff), | |
((value >> 8) & 0xff), | |
((value >> 0) & 0xff), | |
} | |
keySlice := []byte(key) | |
var kstep int32 | |
var k int32 | |
if encypt { | |
kstep = 1 | |
k = 0 | |
} else { | |
kstep = -1 | |
k = 23 | |
} | |
wl := (buf[0] << 8) + buf[1] | |
wr := (buf[2] << 8) + buf[3] | |
for i := 0; i < 12; i++ { | |
wr ^= _skip32_g(keySlice, uint32(k), wl) ^ uint32(k) | |
k += kstep | |
wl ^= _skip32_g(keySlice, uint32(k), wr) ^ uint32(k) | |
k += kstep | |
} | |
buf[0] = (wr >> 8) | |
buf[1] = (wr & 0xFF) | |
buf[2] = (wl >> 8) | |
buf[3] = (wl & 0xFF) | |
return ((buf[0]) << 24) | ((buf[1]) << 16) | ((buf[2]) << 8) | (buf[3]) | |
} | |
func main() { | |
var a uint32 = 2 | |
k := "0123456789" | |
e := skip32Encrypt(a, k) | |
fmt.Println(e) | |
fmt.Println(skip32Decrypt(e, k)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment