ตัวอย่างที่ 1:
วันนี้ฉันมีปัญหากับปัญหา การเข้ารหัส AES ของ Nodejs นั้นไม่สอดคล้องกับการเข้ารหัส Java และ C# แน่นอนว่าสิ่งนี้จะไม่ถูกถอดรหัส ฉันดิ้นรนเป็นเวลานาน: ฉันยังไม่สามารถทำได้ในภายหลัง มีการกล่าวออนไลน์ว่าการใช้งาน NodeJS AES ปกตินั้นแตกต่างจากภาษาอื่น ๆ ตกลง ~~ อาจจะ
โมดูล crypto nodejs
การคัดลอกรหัสมีดังนี้:
var crypto = ต้องการ ('crypto');
ข้อมูล var = "156156165152165156156";
console.log ('cleartext ดั้งเดิม:' + data);
อัลกอริทึม VAR = 'AES-128-ECB';
var key = '78541561566';
var clearEncoding = 'utf8';
// var cipherencoding = 'hex';
// หากบรรทัดถัดไปไม่สม่ำเสมอ Clearext สุดท้ายจะผิด
var cipherencoding = 'base64';
/*การเข้ารหัส*/
var cipher = crypto.createCipher (อัลกอริทึม, คีย์);
var cipherchunks = [];
cipherchunks.push (cipher.update (ข้อมูล, การเข้ารหัส, การเข้ารหัส, การเข้ารหัส));
cipherchunks.push (cipher.final (การเข้ารหัส));
console.log (CipherenCoding + 'Ciphertext:' + CipherChunks.Join (''));
/*การถอดรหัส*/
decipher var = crypto.createdecipher (อัลกอริทึม, คีย์);
var plainchunks = [];
สำหรับ (var i = 0; i <cipherchunks.length; i ++) {
plainchunks.push (decipher.update (cipherchunks [i], การเข้ารหัส, การเข้ารหัส, clearencoding));
-
plainchunks.push (decipher.final (clearencoding));
console.log ("UTF8 Plaintext ตัดสินใจ:" + plainchunks.join (''));
แน่นอนว่าถูกต้อง ~~ การเข้ารหัสและถอดรหัสประสบความสำเร็จ แต่มันแตกต่างจากที่เข้ารหัสใน Java และ C# พระเจ้า. ฉันคิดว่าทุกคนกำลังดิ้นรนที่นี่ ~~ ใช่ไหม? ในความเป็นจริงเพียงเพิ่มเวกเตอร์และมันจะสอดคล้องกัน มีแหล่งข้อมูลที่ค้นหาออนไลน์น้อยเกินไป เป็นเพียงว่าฉันดิ้นรนมานานแล้ว ตกลง รหัสที่ถูกต้องคือ:
การคัดลอกรหัสมีดังนี้:
var crypto = ต้องการ ('crypto');
ข้อมูล var = "156156165152165156156";
console.log ('cleartext ดั้งเดิม:' + data);
อัลกอริทึม VAR = 'AES-128-ECB';
var key = '78541561566';
var clearEncoding = 'utf8';
var iv = "";
// var cipherencoding = 'hex';
// หากบรรทัดถัดไปไม่สม่ำเสมอ Clearext สุดท้ายจะผิด
var cipherencoding = 'base64';
var cipher = crypto.createCipheriv (อัลกอริทึม, คีย์, iv);
var cipherchunks = [];
cipherchunks.push (cipher.update (ข้อมูล, การเข้ารหัส, การเข้ารหัส, การเข้ารหัส));
cipherchunks.push (cipher.final (การเข้ารหัส));
console.log (CipherenCoding + 'Ciphertext:' + CipherChunks.Join (''));
decipher var = crypto.createdecipheriv (อัลกอริทึม, คีย์, iv);
var plainchunks = [];
สำหรับ (var i = 0; i <cipherchunks.length; i ++) {
plainchunks.push (decipher.update (cipherchunks [i], การเข้ารหัส, การเข้ารหัส, clearencoding));
-
plainchunks.push (decipher.final (clearencoding));
console.log ("UTF8 Plaintext ตัดสินใจ:" + plainchunks.join (''));
พบว่าการเข้ารหัสนั้นสอดคล้องกัน โอเคโพสต์ ~~~ ฉันเกลียดคุณเสียวันของฉัน
ตัวอย่างที่ 2:
ในระหว่างการทำงานฉันพบด้านของ NodeJS ที่เข้ารหัสผ่าน AES และ Java ไคลเอนต์ Android ที่ถอดรหัส ด้านข้างในการเข้ารหัส Key ZA และ MD5 อีกครั้งต่อไปนี้เป็นเนื้อหาของการเข้ารหัส AES ECB
nodejs:
การคัดลอกรหัสมีดังนี้:
-
* การเข้ารหัส AES
* ข้อมูล @param
* @param Secrethekey
-
ENCRYPTUTILS.AESENCRYPT = FUNCTION (DATA, SECRETEKY) {
var cipher = crypto.createCipher ('AES-128-ECB', SecretKey);
return cipher.update (data, 'utf8', 'hex') + cipher.final ('hex');
-
-
* การถอดรหัส AES
* ข้อมูล @param
* @param Secrethekey
* @returns {*}
-
ENCRYPTUTILS.AESDECRYPT = FUNCTION (DATA, SECRETEKY) {
var cipher = crypto.createdecipher ('AES-128-ECB', SecretKey);
return cipher.update (data, 'hex', 'utf8') + cipher.final ('UTF8');
-
Java:
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.iofamily.util;
นำเข้า Java.security.MessageDigest;
นำเข้า Javax.crypto.cipher;
นำเข้า Javax.crypto.spec.secretkeyspec;
-
* การเข้ารหัส AES สอดคล้องกับ nodejs
* @author lmiky
* @date 2014-2-25
-
คลาสสาธารณะ aesfornodejs {
สตริงสุดท้ายคงที่สาธารณะ default_coding = "UTF-8";
-
* การถอดรหัส
* @author lmiky
* @date 2014-2-25
* @param เข้ารหัส
* @param Seed
* @กลับ
* @throws ยกเว้น
-
Decrypt สตริงแบบคงที่ส่วนตัว (การเข้ารหัสสตริง, เมล็ดสตริง) โยนข้อยกเว้น {
ไบต์ [] keyb = seed.getBytes (default_coding);
MESAGEDIGEST MD = MESEGATEGEST.GETINSTANCE ("MD5");
Byte [] TheDigest = Md.Digest (keyb);
SecretKeySpec SKEY = New SecretKeySpec (TheDigest, "AES");
CIPHER DCIPHER = CIPHER.GETINSTANCE ("AES");
dcipher.init (cipher.decrypt_mode, skey);
ไบต์ [] clearbyte = dcipher.dofinal (tobyte (เข้ารหัส));
ส่งคืนสตริงใหม่ (ClearByte);
-
-
* การเข้ารหัส
* @author lmiky
* @date 2014-2-25
* เนื้อหา @param
* @param key
* @กลับ
* @throws ยกเว้น
-
การเข้ารหัสสตริงคงที่สาธารณะ (เนื้อหาสตริง, คีย์สตริง) โยนข้อยกเว้น {
ไบต์ [] input = content.getBytes (default_coding);
MESAGEDIGEST MD = MESEGATEGEST.GETINSTANCE ("MD5");
Byte [] TheDigest = Md.Digest (key.getBytes (default_coding));
Secretkeyspec SKC = ใหม่ SecretKeySpec (TheDigest, "AES");
cipher cipher = cipher.getInstance ("AES/ECB/PKCS5Padding");
cipher.init (cipher.encrypt_mode, SKC);
ไบต์ [] ciphertext = byte ใหม่ [cipher.getOutputSize (input.length)];
int ctlength = cipher.update (อินพุต, 0, input.length, ciphertext, 0);
ctlength += cipher.dofinal (ciphertext, ctlength);
ส่งคืน parseByte2Hexstr (ciphertext);
-
-
* สตริงไปยังอาร์เรย์ไบต์
* @author lmiky
* @date 2014-2-25
* @param hexstring
* @กลับ
-
ไบต์คงที่ส่วนตัว [] tobyte (สตริง hexstring) {
int len = hexstring.length () / 2;
ไบต์ [] result = byte ใหม่ [len];
สำหรับ (int i = 0; i <len; i ++) {
ผลลัพธ์ [i] = integer.valueof (hexstring.substring (2 * i, 2 * i + 2), 16) .Bytevalue ();
-
ผลการกลับมา;
-
-
* ไบต์ถึงอาร์เรย์เลขฐานสิบหก
* @author lmiky
* @date 2014-2-25
* @param buf
* @กลับ
-
สตริงคงที่ส่วนตัว parsebyte2hexstr (byte buf []) {
StringBuffer sb = new StringBuffer ();
สำหรับ (int i = 0; i <buf.length; i ++) {
สตริง hex = integer.tohexstring (buf [i] & 0xff);
if (hex.length () == 1) {
hex = '0' + hex;
-
sb.append (hex);
-
ส่งคืน sb.toString ();
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {
System.out.println(AESForNodejs.encrypt("fsadfsdafsdafsdafsdafsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadfsadf
System.out.println (aesfornodejs.decrypt ("5B8E85B7A86AD15A275A7CB61FE4C0606005E8741F68797718A3E90D74B5092A" :::::::::::: ::::::::::::::::::::::: กระทาน ::::::::::::::::::::::: กระทาน
-
-