1.7
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
function decompressPublicKey(compressedKey) {
|
||||
// 获取压缩标志和X坐标
|
||||
var flag = compressedKey.slice(0, 2);
|
||||
var x = compressedKey.slice(2);
|
||||
|
||||
// 定义常量
|
||||
var p = BigInt('0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF', 16);
|
||||
var a = BigInt('0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC', 16);
|
||||
var b = BigInt('0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93', 16);
|
||||
|
||||
// 计算Y坐标
|
||||
// y2 = x3 + ax + b
|
||||
var xBigInt = BigInt('0x' + x);
|
||||
var alpha = (xBigInt ** 3n) % p;
|
||||
var beta = (a * xBigInt + b) % p;
|
||||
var y2 = (alpha + beta) % p;
|
||||
var y = modularExponentiation(y2, (p + 1n) / 4n, p);
|
||||
|
||||
// y2 的值开方有两个值,根据奇偶判定取哪一个
|
||||
if (flag === "02") {
|
||||
// 如果压缩标志为“02”,则Y坐标为偶数
|
||||
if (y % 2n === 0n) {
|
||||
return "04" + x + y.toString(16).padStart(64, '0');
|
||||
} else {
|
||||
y = p - y;
|
||||
return "04" + x + y.toString(16).padStart(64, '0');
|
||||
}
|
||||
} else if (flag === "03") {
|
||||
// 如果压缩标志为“03”,则Y坐标为奇数
|
||||
if (y % 2n === 1n) {
|
||||
return "04" + x + y.toString(16).padStart(64, '0');
|
||||
} else {
|
||||
y = p - y;
|
||||
return "04" + x + y.toString(16).padStart(64, '0');
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
function modularExponentiation(base, exponent, modulus) {
|
||||
var result = 1n;
|
||||
base = base % modulus;
|
||||
while (exponent > 0n) {
|
||||
if (exponent % 2n === 1n) {
|
||||
result = (result * base) % modulus;
|
||||
}
|
||||
base = (base * base) % modulus;
|
||||
exponent = exponent / 2n;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
function hexToBase64(hex) {
|
||||
var bytes = [];
|
||||
for (var i = 0; i < hex.length-1; i += 2) {
|
||||
bytes.push(parseInt(hex.substr(i, 2), 16));
|
||||
}
|
||||
var byteArray = new Uint8Array(bytes);
|
||||
return btoa(String.fromCharCode.apply(null, byteArray));
|
||||
}
|
||||
function base64ToHex(base64) {
|
||||
var binaryString = atob(base64);
|
||||
var byteArray = new Uint8Array(binaryString.length);
|
||||
for (var i = 0; i < binaryString.length; i++) {
|
||||
byteArray[i] = binaryString.charCodeAt(i);
|
||||
}
|
||||
var hexArray = Array.prototype.map.call(byteArray, function(byte) {
|
||||
return ('0' + byte.toString(16)).slice(-2);
|
||||
});
|
||||
return hexArray.join('');
|
||||
}
|
||||
Reference in New Issue
Block a user