プロジェクトの暗号化ヘルパーを実装しようとしています。これらは私が使用しているcryptoJSのバージョンです:
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js</script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha1.js">
そして、これが私が実装した方法です:
var security = function () { };
security.sha1 = function (word) {
var result = CryptoJS.SHA1(word);
return result.toString().toUpperCase();
};
security.encrypt = function (content, key, iv) {
if (key.length != 16) {
console.error('Use chave de 16 digitos');
return;
}
content = CryptoJS.enc.Utf8.parse(content);
key = CryptoJS.enc.Utf8.parse(key);
var iv = CryptoJS.enc.Utf8.parse('1234567812345670');
var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: iv
};
var encrypted = CryptoJS.AES.encrypt(content, key, options);
return encrypted;
};
security.decrypt = function (message, key, iv) {
if (key.length != 16) {
console.error('Use chave de 16 digitos');
return;
}
key = CryptoJS.enc.Utf8.parse(key);
var iv = CryptoJS.enc.Utf8.parse(iv)
var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: iv
};
var result = CryptoJS.AES.decrypt(message, key, options);
return result;
};
$(document).ready(function () {
var original = "texto#a$ser&criptografado! ! ! !";
var hash = security.sha1('blablablabla');
var key = hash.substring(0, 16);
var iv = '1234567812345678';
var crypto = security.encrypt(original, key, iv);
var dcrypt = security.decrypt(crypto, key, iv);
alert(' original: ' + original+
'\n\n sha-1: ' + hash+
'\n\n key: ' + key+
'\n\n resultado: ' + crypto+
'\n\n final: ' + dcrypt.toString(CryptoJS.enc.Utf8));
});
問題は、私がこの奇妙な結果を得ていることです:
原文: texto#a$ser&criptografado! ! ! !
final: texto#a$ser&crixtografado! ! ! !
元のテキストの16番目の文字を常に変更します。(これは、このテスト用の jsfiddle です)
そして、これは同じlibバージョンで正しく動作している別のテストです:
var cryptHelper = function(key,iv){if(key!=undefined&&iv!=undefined)this.initForEncryption(key,iv)};
cryptHelper.prototype = {
key:null,
iv:null,
options: null,
sha1: function(message){
console.log('message = '+message);
var result = CryptoJS.SHA1(message);
return result.toString().toUpperCase();
},
initForEncryption: function(key,iv){
if(key!=undefined&&iv!=undefined){
this.setKey(key);
this.setIv(iv);
this.setOptions();
}else{
throw new Error('null keyOrIv error');
}
},
setKey: function(key){
if(key!=undefined){
if (key.length != 16)
throw new Error('Use chave de 16 digitos');
else
this.key=CryptoJS.enc.Utf8.parse(key);
}
else if(this.key == undefined)
throw new Error('nullEncryptionKeyException');
},
setIv:function(iv){
if(iv!=undefined){
if (iv.length != 16)
throw new Error('Use iv de 16 digitos');
else
this.iv=CryptoJS.enc.Utf8.parse(iv);
}
else if(this.iv == undefined)
throw new Error('nullIvException');
},
setOptions: function(){
this.options = {mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: this.iv }
},
encryptEAS: function(message){
this.checkValues();
return CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(message), this.key, this.options);
},
decryptEAS: function(message){
this.checkValues();
return CryptoJS.AES.decrypt(message, this.key, this.options);
},
checkValues: function(){
if(this.key==undefined || this.iv==undefined)
throw new Error('method unavailable! please init the crypthelper');
}
};
var testeCriptografia = function(){
var helper = new cryptHelper();
var original = "texto#a$ser&criptografado! ! ! !";
var hash = helper.sha1('blablablabla');
var key = hash.substring(0, 16);
var iv = '1234567812345678';
helper.initForEncryption(key,iv);
var crypto = helper.encryptEAS(original);
var dcrypt = helper.decryptEAS(crypto);
alert(' original: ' + original+
'\n\n sha-1: ' + hash+
'\n\n key: ' + key+
'\n\n resultado: ' + crypto+
'\n\n final: ' + dcrypt.toString(CryptoJS.enc.Utf8));
}
$(document).ready(function () {
testeCriptografia();
});
(これは 2 番目のバージョンのjsfiddleです)
問題は、2 番目のバージョンが機能し、最初のバージョンが機能しない理由がわからないことです。
最初のバージョンで何が間違っているか、または両方のバージョンで私の実装がすべて間違っているかどうかを誰かに教えていただければ幸いです。
ありがとう。