clear
// 公私钥
pubkey = 56BA358422010FFE1A1CAAD441DA153255CBD6655A1B745F5D22657A9C4DD355382C4BCE3E32ED1E94C6DA715F19310CB0B5E3DF627301B56C4EAD123F214B03
prikey = 8B3B10A1CEC30677F43C0CC44632F27CE937BE77E3B8BE06C395CC8B51FD4A51
plain = dup( 256, 99 )
cipher = call ecies_enc( $plain, $pubkey )
plain2 = call ecies_dec( $cipher, $prikey )
// test kdf
first = hdup( 30, 40 )
second = hdup( 50, 80 )
// result 1, counter + first + second
x1 = sha1_hash( 00000001 $first $second )
x2 = kdf_sha1( , $first $second, 14 )
if $x1 != $x2
?
pause
endif
// result 2, first + counter + second
x1 = sha1_hash( $first 00000001 $second )
x2 = kdf_sha1( $first, $second, 14 )
if $x1 != $x2
?
pause
endif
// result 3, first + second + counter
x1 = sha1_hash( $first $second 00000001 )
x2 = kdf_sha1( $first $second, , 14 )
if $x1 != $x2
?
pause
endif
end
ecies_enc:
prompt off
local len
local p
local a
local b
local gx
local gy
local n
local h
local input
local k
local key
local mackey
local tmp1
local tmp2
local tmp
local output
input = getpara
ecc_pub = getpara
len = 02 56
P = FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF
A = FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FC
B = 5A C6 35 D8 AA 3A 93 E7 B3 EB BD 55 76 98 86 BC 65 1D 06 B0 CC 53 B0 F6 3B CE 3C 3E 27 D2 60 4B
GX = 6B 17 D1 F2 E1 2C 42 47 F8 BC E6 E5 63 A4 40 F2 77 03 7D 81 2D EB 33 A0 F4 A1 39 45 D8 98 C2 96
GY = 4F E3 42 E2 FE 1A 7F 9B 8E E7 EB 4A 7C 0F 9E 16 2B CE 33 57 6B 31 5E CE CB B6 40 68 37 BF 51 F5
N = FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF BC E6 FA AD A7 17 9E 84 F3 B9 CA C2 FC 63 25 51
H = 01
tmp = new_ecc_initialize( $p, $a, $b, $gx, $gy, $n, $h, hex( 256 /8 ) )
if $tmp != 00
?
pause
endif
? "A1:用随机数发生器产生随机数 k = 1 , n-1;"
// k = 59276E27,D506861A,16680F3A,D9C02DCC,EF3CC1FA,3CDBE4CE,6D54B80D,EAC1BC21
k = random( 32 )
? "A2:计算椭圆曲线点 R = k*G;"
tmp1 = new_ecc_kp( $k, $gx $gy )
? "A3:计算椭圆曲线点 K*Pub"
tmp2 = new_ecc_kp( $k, $ecc_pub )
? "A4:计算 kdf( tmp2, tmp1 );"
tmp = mid( $tmp2, 0, 32 )
xx = kdf_sha256( $tmp, $tmp1, 30 )
key = mid( $xx, 0, 16 )
mackey = mid( $xx, 16, 32 )
? "A5:计算c = enc(m)且t = mac(c)"
output = aes128_encode_cbc( 00, $input, $key )
tmp = hmac_sha256( $output, $mackey )
prompt on
return $tmp1 $output $tmp
ecies_dec:
prompt off
local len
local p
local a
local b
local gx
local gy
local n
local h
local input
local k
local key
local mackey
local tmp1
local tmp2
local tmp
local output
input = getpara
ecc_pri = getpara
len = 02 56
P = FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF
A = FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FC
B = 5A C6 35 D8 AA 3A 93 E7 B3 EB BD 55 76 98 86 BC 65 1D 06 B0 CC 53 B0 F6 3B CE 3C 3E 27 D2 60 4B
GX = 6B 17 D1 F2 E1 2C 42 47 F8 BC E6 E5 63 A4 40 F2 77 03 7D 81 2D EB 33 A0 F4 A1 39 45 D8 98 C2 96
GY = 4F E3 42 E2 FE 1A 7F 9B 8E E7 EB 4A 7C 0F 9E 16 2B CE 33 57 6B 31 5E CE CB B6 40 68 37 BF 51 F5
N = FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF BC E6 FA AD A7 17 9E 84 F3 B9 CA C2 FC 63 25 51
H = 01
tmp = new_ecc_initialize( $p, $a, $b, $gx, $gy, $n, $h, hex( 256 /8 ) )
if $tmp != 00
?
pause
endif
tmp = mid( $input, 0, 64 )
tmp = new_ecc_check_point( $tmp )
if $tmp != 00
?
pause
endif
tmp = mid( $input, 0, 64 )
tmp = new_ecc_kp( $ecc_pri, $tmp )
tmp = mid( $tmp, 0, 32 )
tmp1 = mid( $input, 0, 64 )
tmp = kdf_sha256( $tmp, $tmp1, 30 )
key = mid( $tmp, 0, 16 )
mackey = mid( $tmp, 16, 32 )
len = datalen( $input )
len = sub( $len, 40 )
len = sub( $len, 20 )
len = hex2int( $len )
tmp = mid( $input, 64, $len )
tt = hmac_sha256( $tmp, $mackey )
tmp = mid( $input, int( 64 + $len ), 32 )
if $tt != $tmp
?
pause
endif
tmp = mid( $input, 64, $len )
tmp = aes128_decode_cbc( 00, $tmp, $key )
prompt on
return $tmp