用js實現des代碼(DES算法的實現代碼)

本文目錄一覽:

請教老師DES和DES3的加解密的JS代碼

ecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

//加密

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE, deskey);

return c1.doFinal(src);

} catch (java.security.NoSuchAlgorithmException e1) {

e1.printStackTrace();

} catch (javax.crypto.NoSuchPaddingException e2) {

e2.printStackTrace();

python中如何調用js文件中的方法呢

1、打開pycharm開發工具,點擊File菜單,選擇Settings…,進行第三方模塊安裝;輸入selenium,點擊Install Package。

2、接着在python項目的指定文件夾下,鼠標右鍵新建python文件,輸入文件名並點擊Python file。

3、打開新建的文件,依次導入selenium、webdriver和time。

4、調用webdriver模塊中的Chrome(),使用get()獲取對應網址的內容。

5、調用find_element_by_id()獲取對應頁面元素,然後調用按鈕點擊事件。

6、修改get()方法中的請求路徑,然後保存代碼並運行文件,查看運行結果。

為什麼 CryptoJS DES 加密的結果和 Java DES 不一樣

最近需要對數據進行加密/解密, 因此選用了CryptoJS庫, 對數據做DES算法的加密/解密

首選查看官方示例, 將密文進行Base64編碼, 掉進一個大坑

script src=”htt p:/ /crypto-js.googlecod e.c om/svn/tags/3.1.2/build/rollups/tripledes.js”/script

script

var encrypted = CryptoJS.DES.encrypt(“Message”, “Secret Passphrase”);

// ciphertext changed every time you run it

// 加密的結果不應該每次都是一樣的嗎?

console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));

var decrypted = CryptoJS.DES.decrypt(encrypted, “Secret Passphrase”);

console.log(decrypted.toString(CryptoJS.enc.Utf8));

/script

對這些加密算法不了解, 只能求助Google

des encrypion: js encrypted value does not match the java encrypted value

In cryptoJS you have to convert the key to hex and useit as word just like above (otherwise it will be considered as passphrase)

For the key, when you pass a string, it’s treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key.

原來是我指定key的方式不對, 直接將字符串做為參數, 想當然的以為這就是key, 其實不然, CryptoJS會根據這個字符串算出真正的key和IV(各種新鮮名詞不解釋, 問我也沒用, 我也不懂 -_-“)

那麼我們只需要將key和iv對應的字符串轉成CryptoJS的WordArray類型, 在DES加密時做為參數傳入即可, 這樣對Message這個字符串加密, 每次得到的密文都是YOa3le0I+dI=

var keyHex = CryptoJS.enc.Utf8.parse(‘abcd1234’);

var ivHex = CryptoJS.enc.Utf8.parse(‘inputvec’);

var encrypted = CryptoJS.DES.encrypt(‘Message’, keyHex, { iv: ivHex });

這樣是不是就萬事OK了? 哪有, 誰知道這坑是一個接一個啊.

我們再試試Java這邊的DES加密是不是和這個結果一樣, 具體實現請參考Simple Java Class to DES Encrypt Strings

果真掉坑裡了, Java通過DES加密Message這個字符串得到的結果是8dKft9vkZ4I=和CryptoJS算出來的不一樣啊…親

繼續求助Google

C# and Java DES Encryption value are not identical

SunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES.(JCA Doc)

This means that in the case of the SunJCE provider,

Cipher c1 = Cipher.getInstance(“DES/ECB/PKCS5Padding”);

and

Cipher c1 = Cipher.getInstance(“DES”);

are equivalent statements.

原來是CryptoJS進行DES加密時, 默認的模式和padding方式和Java默認的不一樣造成的, 必須使用ECB mode和PKCS5Padding, 但是CryptoJS中只有Pkcs7, 不管了, 試試看…

script src=”htt p:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/rollups/tripledes.js”/script

script src=”ht tp:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/components/mode-ecb.js”/script

script

var keyHex = CryptoJS.enc.Utf8.parse(‘abcd1234’);

var encrypted = CryptoJS.DES.encrypt(‘Message’, keyHex, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));

/script

咦…使用Pkcs7能得到和Java DES一樣的結果了, 哇塞…好神奇

那我們試試統一Java也改成Cipher.getInstance(“DES/ECB/PKCS7Padding”)試試, 結果得到一個大大的錯誤

Error:java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/ECB/PKCS7Padding

沒辦法, 繼續Google

java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7PADDING

I will point out that PKCS#5 and PKCS#7 actually specify exactly the same type of padding (they are the same!), but it’s called #5 when used in this context. :)

這位大俠給出的解釋是: PKCS#5和PKCS#7是一樣的padding方式, 對加密算法一知半解, 我也只能暫且認可這個解釋了.

忙完了DES的加密, 接下來就是使用CryptoJS來解密了. 我們需要直接解密DES加密後的base64密文字符串. CryptoJS好像沒有提供直接解密DES密文字符串的方法啊, 他的整個加密/解密過程都是內部自己在玩, 解密時需要用到加密的結果對象, 這不是坑我嗎?

只好研究下CryptoJS DES加密後返回的對象, 發現有一個屬性ciphertext, 就是密文的WordArray, 那麼解密的時候, 我們是不是只要提供這個就行了呢?

var keyHex = CryptoJS.enc.Utf8.parse(‘abcd1234’);

// direct decrypt ciphertext

var decrypted = CryptoJS.DES.decrypt({

ciphertext: CryptoJS.enc.Base64.parse(‘8dKft9vkZ4I=’)

}, keyHex, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

console.log(decrypted.toString(CryptoJS.enc.Utf8));

果不其然, 到此為止, 問題全部解決, 豁然開朗…

完整代碼請參考CryptoJS-DES.html

Use CryptoJS encrypt message by DES and direct decrypt ciphertext, compatible with Java Cipher.getInstance(“DES”)

關於nodejs 怎麼實現 crypto des加密

就是加密和解密使用同一個密鑰,通常稱之為「Session Key 」這種加密技術在當今被廣泛採用,如美國政府所採用的DES加密標準就是一種典型的「對稱式」加密法,它的Session Key長度為56bits。

非對稱式加密:

就是加密和解密所使用的不是同一個密鑰,通常有兩個密鑰,稱為「公鑰」和「私鑰」,它們兩個必需配對使用,否則不能打開加密文件。

加密為系統中經常使用的功能,node自帶強大的加密功能Crypto,下面通過簡單的例子進行練習。

1、加密模塊的引用:

var crypto=require(‘crypto’);

var $=require(‘underscore’);var DEFAULTS = {

encoding: {

input: ‘utf8’,

output: ‘hex’

},

algorithms: [‘bf’, ‘blowfish’, ‘aes-128-cbc’]

};

默認加密算法配置項:

輸入數據格式為utf8,輸出格式為hex,

算法使用bf,blowfish,aes-128-abc三種加密算法;

2、配置項初始化:

function MixCrypto(options) {

if (typeof options == ‘string’)

options = { key: options };

options = $.extend({}, DEFAULTS, options);

this.key = options.key;

this.inputEncoding = options.encoding.input;

this.outputEncoding = options.encoding.output;

this.algorithms = options.algorithms;

}

加密算法可以進行配置,通過配置option進行不同加密算法及編碼的使用。

3、加密方法代碼如下:

MixCrypto.prototype.encrypt = function (plaintext) {

return $.reduce(this.algorithms, function (memo, a) {

var cipher = crypto.createCipher(a, this.key);

return cipher.update(memo, this.inputEncoding, this.outputEncoding)

+ cipher.final(this.outputEncoding)

}, plaintext, this);

};

使用crypto進行數據的加密處理。

4、解密方法代碼如下:

MixCrypto.prototype.decrypt = function (crypted) {

try {

return $.reduceRight(this.algorithms, function (memo, a) {

var decipher = crypto.createDecipher(a, this.key);

return decipher.update(memo, this.outputEncoding, this.inputEncoding)

+ decipher.final(this.inputEncoding);

}, crypted, this);

} catch (e) {

return;

}

};

原創文章,作者:GY6JQ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/129990.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GY6JQ的頭像GY6JQ
上一篇 2024-10-03 23:27
下一篇 2024-10-03 23:27

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29

發表回復

登錄後才能評論