原文合集地址如下,有需要的朋友可以關(guān)注
本文地址
對(duì)稱加密
對(duì)稱加密是一種加密算法,也稱為私鑰加密。在對(duì)稱加密中,使用同一個(gè)密鑰(也稱為私鑰或密鑰)對(duì)數(shù)據(jù)進(jìn)行加密和解密。加密和解密過程都使用相同的密鑰,因此稱為對(duì)稱加密。
對(duì)稱加密的過程如下:
-
加密:將明文(原始數(shù)據(jù))和密鑰作為輸入,經(jīng)過特定的加密算法,生成密文(加密后的數(shù)據(jù))。
-
解密:將密文和相同的密鑰作為輸入,經(jīng)過特定的解密算法,還原出明文。
對(duì)稱加密算法具有以下特點(diǎn):
-
快速:相比非對(duì)稱加密算法,對(duì)稱加密算法的加密和解密速度更快,適用于大量數(shù)據(jù)的加解密操作。
-
簡(jiǎn)單:對(duì)稱加密算法的實(shí)現(xiàn)相對(duì)簡(jiǎn)單,只需要使用相同的密鑰進(jìn)行加解密操作。
-
安全性限制:由于加密和解密使用相同的密鑰,密鑰的管理和傳輸是對(duì)稱加密的一個(gè)重要挑戰(zhàn)。如果密鑰被泄露,那么整個(gè)加密系統(tǒng)就會(huì)受到威脅。
-
適用場(chǎng)景:對(duì)稱加密通常用于對(duì)數(shù)據(jù)進(jìn)行加密,以保護(hù)數(shù)據(jù)的機(jī)密性。然而,在需要數(shù)據(jù)的安全性和完整性驗(yàn)證時(shí),通常需要使用額外的手段,如數(shù)字簽名和消息認(rèn)證碼。
常見的對(duì)稱加密算法包括DES(Data Encryption Standard)、AES(Advanced Encryption Standard)和3DES(Triple Data Encryption Standard)等。
AES
AES(Advanced Encryption Standard)是一種對(duì)稱加密算法,用于保護(hù)敏感數(shù)據(jù)的安全性。它是目前廣泛使用的加密算法之一,具有高安全性和較快的加密/解密速度。AES支持128位、192位和256位密鑰長(zhǎng)度。
AES的加密和解密過程涉及以下步驟:
-
密鑰擴(kuò)展(Key Expansion):根據(jù)輸入的密鑰生成多個(gè)輪密鑰。
-
初始輪(Initial Round):將輸入數(shù)據(jù)和第一個(gè)輪密鑰進(jìn)行異或運(yùn)算。
-
主要輪(Main Rounds):重復(fù)執(zhí)行一系列步驟,包括字節(jié)替換、行移位、列混淆和輪密鑰加。
-
最終輪(Final Round):執(zhí)行最后一輪操作,不包含列混淆。
-
輸出:得到加密后的數(shù)據(jù)。
在JavaScript中,可以使用crypto庫(kù)來實(shí)現(xiàn)AES加密。注意,crypto庫(kù)是Node.js的內(nèi)置模塊,不適用于瀏覽器環(huán)境。
下面是使用Node.js的crypto庫(kù)實(shí)現(xiàn)AES加密的示例代碼:
const crypto = require('crypto');
// 加密函數(shù)
function encrypt(text, key) {
const cipher = crypto.createCipher('aes-256-cbc', key);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
}
// 解密函數(shù)
function decrypt(encrypted, key) {
const decipher = crypto.createDecipher('aes-256-cbc', key);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// 測(cè)試
const originalText = 'Hello, this is a secret message.';
const encryptionKey = 'my-secret-key';
const encryptedText = encrypt(originalText, encryptionKey);
console.log('Encrypted:', encryptedText);
const decryptedText = decrypt(encryptedText, encryptionKey);
console.log('Decrypted:', decryptedText);
上述代碼中,使用AES-256-CBC加密模式和一個(gè)密鑰來對(duì)數(shù)據(jù)進(jìn)行加密和解密。
非對(duì)稱加密
非對(duì)稱加密是一種加密算法,也稱為公鑰加密。在非對(duì)稱加密中,使用一對(duì)密鑰,分別為公鑰和私鑰,來進(jìn)行加密和解密操作。公鑰可以公開給其他人使用,而私鑰必須保密,只有密鑰的所有者可以訪問。
非對(duì)稱加密的過程如下:
-
加密:使用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,生成密文(加密后的數(shù)據(jù))。
-
解密:只有使用與加密時(shí)相對(duì)應(yīng)的私鑰,才能對(duì)密文進(jìn)行解密,還原出原始的明文數(shù)據(jù)。
由于公鑰可以公開給其他人使用,而私鑰只有密鑰的所有者持有,因此非對(duì)稱加密提供了更好的密鑰管理和分發(fā)機(jī)制。非對(duì)稱加密算法廣泛應(yīng)用于數(shù)字簽名、身份認(rèn)證、密鑰交換等場(chǎng)景。
非對(duì)稱加密算法具有以下特點(diǎn):
-
安全性:非對(duì)稱加密算法提供了較高的安全性,即使公鑰泄露也不會(huì)導(dǎo)致密文被解密。
-
密鑰分發(fā):由于公鑰可以公開,因此密鑰的分發(fā)和交換更加便捷和安全。
-
效率:與對(duì)稱加密相比,非對(duì)稱加密的加密和解密速度較慢,適用于處理較小的數(shù)據(jù)塊。
-
數(shù)字簽名:非對(duì)稱加密可以用于生成和驗(yàn)證數(shù)字簽名,確保數(shù)據(jù)的完整性和來源可信性。
常見的非對(duì)稱加密算法包括RSA(Rivest-Shamir-Adleman)、DSA(Digital Signature Algorithm)、ECC(Elliptic Curve Cryptography)等。
RSA
RSA(Rivest-Shamir-Adleman)是一種非對(duì)稱加密算法,其加密和解密過程使用不同的密鑰,即公鑰和私鑰。RSA加密算法的原理如下:
-
密鑰生成:
- 隨機(jī)選擇兩個(gè)大素?cái)?shù)p和q。
- 計(jì)算n = p * q。
- 計(jì)算歐拉函數(shù)φ(n) = (p-1) * (q-1)。
- 隨機(jī)選擇一個(gè)整數(shù)e,1 < e < φ(n),且e與φ(n)互質(zhì)。
- 計(jì)算d,使得 (d * e) % φ(n) = 1。
- 公鑰為(n, e),私鑰為(n, d)。
-
加密過程:
- 將明文消息轉(zhuǎn)換為整數(shù)m,且 0 < m < n。
- 計(jì)算密文c = (m^e) % n。
-
解密過程:
- 使用私鑰中的d來計(jì)算明文消息m = (c^d) % n。
在JavaScript中,可以使用crypto庫(kù)的crypto.publicEncrypt
和crypto.privateDecrypt
方法來實(shí)現(xiàn)RSA加密和解密。注意,crypto庫(kù)是Node.js的內(nèi)置模塊,不適用于瀏覽器環(huán)境。
以下是使用Node.js的crypto庫(kù)實(shí)現(xiàn)RSA加密的示例代碼:
const crypto = require('crypto');
// 生成RSA密鑰對(duì)
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048, // RSA密鑰長(zhǎng)度
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc', // 私鑰加密算法
passphrase: 'my-secret-passphrase' // 私鑰加密密碼
}
});
// 明文消息
const plaintext = 'Hello, this is a secret message.';
// 使用公鑰加密
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(plaintext, 'utf8'));
console.log('Encrypted:', encrypted.toString('base64'));
// 使用私鑰解密
const decrypted = crypto.privateDecrypt(
{
key: privateKey,
passphrase: 'my-secret-passphrase'
},
encrypted
);
console.log('Decrypted:', decrypted.toString('utf8'));
在上述代碼中,使用2048位的RSA密鑰對(duì)來進(jìn)行加密和解密。注意,在生成RSA密鑰對(duì)時(shí),私鑰被加密,并使用passphrase
指定私鑰的加密密碼。在解密時(shí),需要提供私鑰和相應(yīng)的密碼。
由于RSA算法涉及大數(shù)運(yùn)算,密鑰的生成和加密解密過程相對(duì)較慢。因此,在實(shí)際應(yīng)用中,通常將RSA用于對(duì)小塊數(shù)據(jù)(如對(duì)稱密鑰)進(jìn)行加密,而不是直接對(duì)大數(shù)據(jù)進(jìn)行加密。
DSA
DSA(Digital Signature Algorithm)是一種非對(duì)稱加密算法,用于數(shù)字簽名和驗(yàn)證數(shù)字簽名的有效性。與RSA類似,DSA也使用公鑰和私鑰來實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證。
DSA加密算法的原理如下:
-
密鑰生成:
- 隨機(jī)選擇一個(gè)大素?cái)?shù)p和一個(gè)較小的整數(shù)q,滿足p-1能被q整除。
- 選擇一個(gè)整數(shù)g,1 < g < p,使得g^q % p = 1。
- 隨機(jī)選擇一個(gè)整數(shù)x,1 < x < q,作為私鑰。
- 計(jì)算y = g^x % p,作為公鑰。
- 公鑰為(p, q, g, y),私鑰為x。
-
數(shù)字簽名:
- 假設(shè)要對(duì)消息m進(jìn)行簽名。
- 隨機(jī)選擇一個(gè)整數(shù)k,1 < k < q。
- 計(jì)算r = (g^k % p) % q。
- 計(jì)算s = (k^(-1) * (SHA1(m) + x * r)) % q,其中SHA1(m)表示對(duì)消息m進(jìn)行哈希運(yùn)算。
- 數(shù)字簽名為(r, s)。
-
驗(yàn)證數(shù)字簽名:
- 假設(shè)收到消息m和數(shù)字簽名(r, s)以及公鑰(p, q, g, y)。
- 計(jì)算w = s^(-1) % q。
- 計(jì)算u1 = (SHA1(m) * w) % q。
- 計(jì)算u2 = (r * w) % q。
- 計(jì)算v = ((g^u1 * y^u2) % p) % q。
- 如果v等于r,則數(shù)字簽名有效,否則無效。
在JavaScript中,可以使用Node.js的crypto庫(kù)的crypto.createSign
和crypto.createVerify
方法來實(shí)現(xiàn)DSA數(shù)字簽名和驗(yàn)證。注意,crypto庫(kù)是Node.js的內(nèi)置模塊,不適用于瀏覽器環(huán)境。
以下是使用Node.js的crypto庫(kù)實(shí)現(xiàn)DSA數(shù)字簽名和驗(yàn)證的示例代碼:
const crypto = require('crypto');
// 明文消息
const message = 'Hello, this is a message to sign with DSA.';
// 生成DSA密鑰對(duì)
const { privateKey, publicKey } = crypto.generateKeyPairSync('dsa', {
modulusLength: 1024, // DSA密鑰長(zhǎng)度
});
// 創(chuàng)建簽名對(duì)象
const sign = crypto.createSign('DSA');
// 使用私鑰對(duì)消息進(jìn)行簽名
sign.update(message);
const signature = sign.sign(privateKey, 'hex');
console.log('Signature:', signature);
// 創(chuàng)建驗(yàn)證對(duì)象
const verify = crypto.createVerify('DSA');
// 使用公鑰驗(yàn)證簽名的有效性
verify.update(message);
const isSignatureValid = verify.verify(publicKey, signature, 'hex');
console.log('Signature Valid:', isSignatureValid);
在上述代碼中,使用1024位的DSA密鑰對(duì)來對(duì)消息進(jìn)行簽名和驗(yàn)證。注意,對(duì)于更高的安全要求,建議使用更大的密鑰長(zhǎng)度。與RSA類似,DSA的密鑰生成和簽名驗(yàn)證過程也相對(duì)較慢,因此在實(shí)際應(yīng)用中需要根據(jù)需求和性能進(jìn)行權(quán)衡。
哈希函數(shù)
哈希函數(shù)是一種將任意長(zhǎng)度的數(shù)據(jù)映射為固定長(zhǎng)度哈希值(散列值)的函數(shù)。哈希函數(shù)將輸入數(shù)據(jù)(也稱為消息或明文)轉(zhuǎn)換為固定長(zhǎng)度的哈希值,通常用一個(gè)固定長(zhǎng)度的字符串(如十六進(jìn)制表示)來表示哈希值。哈希函數(shù)的輸出通常稱為哈希碼、散列碼或摘要。
哈希函數(shù)具有以下特點(diǎn):
-
固定輸出長(zhǎng)度:哈希函數(shù)產(chǎn)生的哈希值長(zhǎng)度固定,無論輸入數(shù)據(jù)的長(zhǎng)度是多少,都會(huì)生成固定長(zhǎng)度的哈希值。
-
單向不可逆:哈希函數(shù)是單向不可逆的,即從哈希值無法還原出原始輸入數(shù)據(jù)。這意味著無法從哈希值計(jì)算出原始數(shù)據(jù),保護(hù)了數(shù)據(jù)的安全性。
-
雪崩效應(yīng):即使輸入數(shù)據(jù)的微小變化,也會(huì)導(dǎo)致生成的哈希值有很大的差異,保證了數(shù)據(jù)的完整性。
-
碰撞概率:哈希函數(shù)的輸入空間可能遠(yuǎn)大于輸出空間,因此存在兩個(gè)不同的輸入數(shù)據(jù)生成相同的哈希值的可能,這被稱為碰撞。好的哈希函數(shù)應(yīng)該盡量避免碰撞,即使碰撞概率很小。
哈希函數(shù)在計(jì)算機(jī)科學(xué)和密碼學(xué)中有廣泛的應(yīng)用,例如:
- 數(shù)據(jù)完整性驗(yàn)證:用于確保數(shù)據(jù)在傳輸或存儲(chǔ)過程中沒有被篡改。
- 數(shù)據(jù)加密:用于密碼學(xué)中生成數(shù)字指紋,進(jìn)行數(shù)字簽名,驗(yàn)證消息等。
- 散列表:用于散列算法,將數(shù)據(jù)映射到散列表的索引位置。
常見的哈希函數(shù)包括MD5、SHA-1、SHA-256、SHA-512等。
SHA-256
SHA-256(Secure Hash Algorithm 256-bit)是一種密碼學(xué)哈希函數(shù),用于將任意長(zhǎng)度的消息轉(zhuǎn)換為256位的固定長(zhǎng)度哈希值。SHA-256是SHA-2系列中的一種,具有較高的安全性,被廣泛用于數(shù)字簽名、數(shù)據(jù)完整性驗(yàn)證等應(yīng)用。
SHA-256的原理如下:
-
初始化:初始化一組常數(shù),作為哈希算法中使用的初始變量。
-
填充消息:對(duì)輸入消息進(jìn)行填充,使得消息長(zhǎng)度滿足一定的要求。填充包括添加一個(gè)1和若干個(gè)0來保證消息長(zhǎng)度達(dá)到特定長(zhǎng)度。
-
處理消息分組:將填充后的消息分成多個(gè)512位的分組,并對(duì)每個(gè)分組進(jìn)行處理。
-
處理分組:對(duì)每個(gè)分組進(jìn)行64輪的運(yùn)算。每輪運(yùn)算涉及四個(gè)操作:置換、邏輯運(yùn)算、加法和置換。
-
計(jì)算結(jié)果:對(duì)最后一個(gè)分組的輸出進(jìn)行連接,得到256位的哈希值。
在JavaScript中,可以使用Node.js的crypto庫(kù)來實(shí)現(xiàn)SHA-256哈希函數(shù)。注意,crypto庫(kù)是Node.js的內(nèi)置模塊,不適用于瀏覽器環(huán)境。
以下是使用Node.js的crypto庫(kù)實(shí)現(xiàn)SHA-256哈希函數(shù)的示例代碼:
const crypto = require('crypto');
function sha256(input) {
return crypto.createHash('sha256').update(input).digest('hex');
}
// 測(cè)試
const message = 'Hello, this is a message to hash with SHA-256.';
const hashValue = sha256(message);
console.log('SHA-256 Hash:', hashValue);
在上述代碼中,定義了一個(gè)sha256
函數(shù)來計(jì)算輸入消息的SHA-256哈希值。通過調(diào)用crypto.createHash('sha256')
創(chuàng)建SHA-256哈希對(duì)象,然后使用update
方法傳入要計(jì)算的消息,最后使用digest('hex')
方法獲取十六進(jìn)制表示的256位哈希值。
注意,SHA-256是單向不可逆的哈希函數(shù),意味著無法從哈希值還原出原始消息。哈希函數(shù)的主要應(yīng)用是驗(yàn)證數(shù)據(jù)的完整性,而不是加密。因此,SHA-256哈希值的安全性取決于其抗碰撞(collision resistance)和抗第二像性(second preimage resistance)的能力。
MD5
MD5(Message Digest Algorithm 5)是一種單向不可逆的哈希函數(shù),用于將任意長(zhǎng)度的消息轉(zhuǎn)換為128位的固定長(zhǎng)度哈希值。MD5的加密原理主要包括以下步驟:
-
填充消息:將輸入的消息按照一定的規(guī)則進(jìn)行填充,使得消息長(zhǎng)度滿足特定要求。填充的目的是將消息長(zhǎng)度擴(kuò)展為512位的倍數(shù),以便后續(xù)處理。
-
初始化緩沖區(qū):MD5使用四個(gè)32位的緩沖區(qū)(A、B、C和D)來存儲(chǔ)中間結(jié)果。這些緩沖區(qū)是在加密過程中不斷更新的。
-
處理消息分組:將填充后的消息分成多個(gè)512位的分組,并對(duì)每個(gè)分組進(jìn)行處理。
-
處理分組:對(duì)每個(gè)512位的分組進(jìn)行64輪的循環(huán)運(yùn)算。每輪運(yùn)算包括四個(gè)步驟:置換、邏輯運(yùn)算、加法和置換。
-
輸出結(jié)果:對(duì)最后一個(gè)分組進(jìn)行處理后,得到128位的MD5哈希值,即最終結(jié)果。
MD5的核心運(yùn)算主要涉及位操作、邏輯運(yùn)算和加法運(yùn)算,通過多次迭代和混淆來確保生成的哈希值具有較好的雪崩效應(yīng)和碰撞抵抗能力。
MD5加密(或稱哈希)是單向不可逆的,意味著無法從MD5哈希值還原出原始消息。MD5的主要應(yīng)用是用于驗(yàn)證數(shù)據(jù)的完整性和校驗(yàn),而不是用于加密敏感數(shù)據(jù)。
由于MD5算法的安全性存在缺陷,它容易受到碰撞攻擊(collision attack),即兩個(gè)不同的輸入可能產(chǎn)生相同的MD5哈希值,從而降低了數(shù)據(jù)完整性驗(yàn)證的可靠性。因此,在安全性要求較高的場(chǎng)景中,建議使用更強(qiáng)大的哈希算法如SHA-256來代替MD5。
在JavaScript中,可以使用Node.js的crypto庫(kù)來實(shí)現(xiàn)MD5哈希函數(shù)。請(qǐng)注意,crypto庫(kù)是Node.js的內(nèi)置模塊,不適用于瀏覽器環(huán)境。文章來源:http://www.zghlxwxcb.cn/news/detail-645872.html
以下是使用Node.js的crypto庫(kù)實(shí)現(xiàn)MD5哈希函數(shù)的示例代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-645872.html
const crypto = require('crypto');
function md5(input) {
return crypto.createHash('md5').update(input).digest('hex');
}
// 測(cè)試
const message = 'Hello, this is a message to hash with MD5.';
const hashValue = md5(message);
console.log('MD5 Hash:', hashValue);
到了這里,關(guān)于常用加密算法及實(shí)現(xiàn)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!