transx/tscipher/xor.go

62 lines
1.6 KiB
Go

package tscipher
/*
#cgo CFLAGS: -O3
#include <stdlib.h>
char* decrypt(char* inBuff,char* buff,int buffLen,char* key,int keyLen){
for(int i=0;i<buffLen;i++){
inBuff[i]=buff[buffLen-i-1]^key[i%keyLen];
}
return inBuff;
}
char* encrypt(char* inBuff,char* buff,int buffLen,char* key,int keyLen){
for(int i=0;i<buffLen;i++){
inBuff[buffLen-i-1]=buff[i]^key[i%keyLen];
}
return inBuff;
}
*/
import "C"
import "unsafe"
type XOR struct {
key []byte
}
func (this *XOR) Decrypt(data []byte) (decrypted []byte, err error) {
// decrypted = data
// err = nil
// return
decrypted = make([]byte, len(data))
// for i := 0; i < len(data); i++ {
// decrypted[i] = data[len(data)-i-1] ^ this.key[i%len(this.key)]
// // decrypted[i] = data[i]
// }
key := this.key
C.decrypt((*C.char)(unsafe.Pointer(&decrypted[0])), (*C.char)(unsafe.Pointer(&data[0])), C.int(len(data)), (*C.char)(unsafe.Pointer(&key[0])), C.int(len(key)))
err = nil
return
}
func (this *XOR) Encrypt(data []byte) (encryped []byte, err error) {
// encryped = data
// err = nil
// return
encryped = make([]byte, len(data))
// for i := 0; i < len(data); i++ {
// encryped[len(data)-i-1] = data[i] ^ this.key[i%len(this.key)]
// // encryped[i] = data[i]
// }
key := this.key
C.encrypt((*C.char)(unsafe.Pointer(&encryped[0])), (*C.char)(unsafe.Pointer(&data[0])), C.int(len(data)), (*C.char)(unsafe.Pointer(&key[0])), C.int(len(key)))
err = nil
return
}
func NewXOR(key []byte) (cipher Cipher) {
return &XOR{
key: key,
}
}