Ed 25519 응용, node, js 에서 자주 사용 하 는 키 쌍 생 성
Ed 25519 저자
Daniel J. Bernstein 은 세계 적 으로 유명한 암호 학자 입 니 다.
우세 하 다.
완전 개방 디자인, 알고리즘 각 매개 변 수 는 직접적 이 고 명확 하 며 큰 확률 로 캐 시, 시간, 악의 적 인 입력 을 통 해 안전성 을 파괴 합 니 다. 한편, 25519 시리즈 타원 곡선 은 특별 디자인 을 통 해 가능 한 한 오류 확률 을 최소 화 했 습 니 다. 25519 시리즈 곡선 은 현재 가장 빠 른 타원 곡선 암호 화 알고리즘 입 니 다. 4 핵 2.4GHz 의 Westmere cpu 입 니 다.초당 71000 개의 서명 을 검증 할 수 있 습 니 다.
기본 특징
공공 키 는 32 바이트 만 있 고 비밀 키 는 64 바이트 만 있 습 니 다.
실전 node, js 생 성 Ed 25519 키 쌍
목표.
tweetnacl 을 통 해 원본 Uint8Array 키 쌍 을 생 성하 고 공개 키, 비밀 키 형식 이니셜 G, S 를 Buffer 에 기록 한 다음 비밀 키 를 Buffer 에 기록 합 니 다. 위의 Buffer 를 통 해 검사 코드 를 계산 하여 buffer 에 다시 기록 하고 마지막 으로 base 32 인 코딩 을 사용 합 니 다.사용자 가 일반적으로 저장 하 는 문자열 을 생 성 합 니 다.
우선 의존 패키지 설치
npm I tweetnacl crc lodash base32.js —save
설명 아래 가방 의 역할 트 위 터 nacl: 가장 핵심 적 인 가방 은 자바 script 인터페이스 로 이 루어 진 트 위 터 Naci / naci 포트 로 키 암호 화 복호화, 공개 키 검증 암호 화, 공공 서명, hash 등 을 실현 합 니 다.이 라 이브 러 리 를 사용 하여 원본 Uint 8 Array 키 쌍 을 만 들 것 입 니 다.64byte 비밀 키 를 무 작위 로 만 든 다음 키 pair 로 해석 할 수도 있 습 니 다.crc: 검사 코드 를 만 드 는 lodash: 일치 성, 모듈 화, 고성능 자바 스 크 립 트 유 틸 리 티 라 이브 러 리 입 니 다.base32. js: 네 이 티 브 방법 으로 base 64 만 있 기 때문에 base32. js 를 도입 하여 인 코딩 디 코딩 을 진행 합 니 다.구체 적 인 코드 구현
//
const nacl = require(“tweetnacl");
const crc = require("crc");
const base32 = require("base32.js")
const isUndefined = require("lodash/isUndefined");
const isNull = require("lodash/isNull");
const isString = require("lodash/isString");
const versionBytes = {
ed25519PublicKey: 6 << 3, // G
ed25519SecretSeed: 18 << 3, // S
preAuthTx: 19 << 3, // T
sha256Hash: 23 << 3 // X
};
// , keypair,
class Keypair {
constructor(){
this.orikeypair = nacl.sign.keyPair();
this.publicKey = Buffer.from(this.orikeypair.publicKey);
console.log(this.orikeypair.publicKey);
this.privateKey = Buffer.from(this.orikeypair.secretKey);
}
static encodeCheck(versionByteName, data) {
if (isNull(data) || isUndefined(data)) {
throw new Error("cannot encode null data");
}
let versionByte = versionBytes[versionByteName];
if (isUndefined(versionByte)) {
throw new Error(`${versionByteName} is not a valid version byte name. expected one of "ed25519PublicKey", "ed25519SecretSeed", "preAuthTx", "sha256Hash"`);
}
data = Buffer.from(data);
let versionBuffer = Buffer.from([versionByte]);
let payload = Buffer.concat([versionBuffer, data]);
let checksum = calculateChecksum(payload);
let unencoded = Buffer.concat([payload, checksum]);
return base32.encode(unencoded);
}
static decodeCheck(versionByteName, encoded) {
if (!isString(encoded)) {
throw new TypeError('encoded argument must be of type String');
}
let decoded = base32.decode(encoded);
let versionByte = decoded[0];
let payload = decoded.slice(0, -2);
let data = payload.slice(1);
let checksum = decoded.slice(-2);
if (encoded != base32.encode(decoded)) {
throw new Error('invalid encoded string');
}
let expectedVersion = versionBytes[versionByteName];
if (isUndefined(expectedVersion)) {
throw new Error(`${versionByteName} is not a valid version byte name. expected one of "accountId" or "seed"`);
}
if (versionByte !== expectedVersion) {
throw new Error(`invalid version byte. expected ${expectedVersion}, got ${versionByte}`);
}
let expectedChecksum = calculateChecksum(payload);
if (!verifyChecksum(expectedChecksum, checksum)) {
throw new Error(`invalid checksum`);
}
return Buffer.from(data);
}
}
function calculateChecksum(payload) {
// This code calculates CRC16-XModem checksum of payload
// and returns it as Buffer in little-endian order.
let checksum = Buffer.alloc(2);
checksum.writeUInt16LE(crc.crc16xmodem(payload), 0);
return checksum;
}
//
let newKeypair = new Keypair();
console.log(newKeypair.publicKey);
let newPublic = Keypair.encodeCheck("ed25519PublicKey",newKeypair.publicKey);
let newPrivate = Keypair.encodeCheck("ed25519SecretSeed",newKeypair.privateKey);
let publicBuffer = Keypair.decodeCheck("ed25519PublicKey",newPublic);
console.log(newPublic,newPrivate);
console.log(publicBuffer);
설명 하 다.
가방 에 대한 자세 한 api 는 가방 이름 을 직접 복사 하여 github 에서 찾 을 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
RSA 플러스 / 복호화 알고리즘 - miracl 대수 라 이브 러 리 구현제 가 세 편의 < > 를 가지 고 있 는 것 을 보 았 는 지 이상 할 수도 있 습 니 다. 사실은 많은 사람들 이 저 에 게 RSA 암호 화 해 제 를 요구 하 는 코드 입 니 다. 만약 에 매번 똑 같은 것 을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.