2013-01-15 44 views
5

注:我發現一個similar question,但它是在Python中。 有沒有辦法將字符串轉換爲基數爲10的數字進行加密?


我一直在想這個算法或本地方法,我很難過。

這是我到目前爲止有:

encode=function(n,f){ 
    return (n).toString(f) 
} 
decode=function(s,f){ 
    return parseInt(s,f) 
} 

基本上,我需要一種方法來將字符串轉換,像'Hello World!'到基10(十六進制也能發揮作用)號,像14438792758793754875,和我不知道是否有這樣做之前,我可能是浪費我的時間,像有道:

str='Hello World' 
returnString='' 
for(var i in str){ 
    returnString+=(
     str[i]=='A'?'0' 
     :str[i]=='B'?'1' 
     etc... 
    ) 
} 

不僅那會是非常耗時的,但我不知道我怎麼會可能將其轉換回,如一旦我進入像這樣的數字爲L,for循環不會,並且會返回BB

我問這個問題的原因是因爲我打算將來使用它來獲得更高效和安全的加密存儲。例如,像這樣:

//save 
numstr=encodeToNumber(inputElement.value) 
b36str=encode(numstr,36) 
storage['items'].push(b36str) 
localStorage['App Data']=JSON.stringify(storage) 

//load 
if(localStorage['App Data']){ 
    storage=JSON.parse(localStorage['App Data']) 
}else{ 
    storage={ 
     items:[], 
     config:{ 
      etc 
     } 
    } 
} 
//Assuming storage.items looks like this: ['rgie', 'zyy', '2il7'] 
for(i in storage['items']){ 
    b36str=storage['items']//rgie, zyy, 2il7 
    numstr=decode(b36str,36)//1281110, 46618, 117403 
    container.innerHTML+='<hr>'+decodeFromNumber(numstr)//Milk, Eggs, Bread 
} 

//Output 
Milk 
Eggs 
Bread 

其實我花幾分鐘手動加密「牛奶」,「蛋」和「麪包」他們的base36同行所以它可能是準確的。


更新:Aadit M Shaw了從字符串產生十六進制字符串的函數,我扭轉它改造成我的需求,並得到這個:

en=function(s){ 
    var s2d=function(s){ 
     s=s.replace(/ /g,'+').replace(/!/g,'.') 
     var n=[] 
     for(var i in s){ 
      n.push(s.charCodeAt(i)) 
     } 
     return n 
    } 
    var arr=s2d(s) 
    var s2='' 
    for (var i in arr){ 
     s2+=arr[i].toString(36) 
    } 
    return s2 
} 
de=function(s){ 
    var arr=s.split(/(..)/) 
    var arr2=[] 
    var s2='' 
    for(var i in arr){ 
     if(arr[i]){ 
      arr2.push(parseInt(arr[i],36)) 
     } 
    } 
    for(var i in arr2){ 
     s2+=String.fromCharCode(arr2[i]) 
    } 
    return s2.replace(/\+/g,' ') 
} 

雖然編碼字符串大於我所希望的,它可能有助於防止被黑客入侵或者其他什麼。

例如,使用我製作的示例here,我發出了此消息21173b2x3030172t2p38173d333936172u2p2r2t以及此ЎDŽ̺ǦDŽ̌。如果你設法解碼第二個,然後解碼這也ʒ̴ͻϮ

雖然這不是很實際,所以我可能會最終使用庫Ragnarokkr鏈接到我。

謝謝大家的回覆!

+0

定義「加密」:爲什麼不只是加密了嗎? –

+0

@Dave我不確定我是否理解你的問題。如果你問我爲什麼不使用我提供的'encode'方法,那是因爲它只接受10個整數。 –

+3

如果你想要一些安全的東西,這樣的事情是無用的。我問你爲什麼不使用真正的加密,而是試圖自己實現某些東西?我不明白你對「基數10整數」的評論,你說它可能是十六進制的 - 這是什麼? –

回答

6

試試這個:

function encode(string) { 
    var number = "0x"; 
    var length = string.length; 
    for (var i = 0; i < length; i++) 
     number += string.charCodeAt(i).toString(16); 
    return number; 
} 

在這裏看到演示:http://jsfiddle.net/hGKAg/2/

解碼也很簡單:

function decode(number) { 
    var string = ""; 
    number = number.slice(2); 
    var length = number.length; 
    for (var i = 0; i < length;) { 
     var code = number.slice(i, i += 2); 
     string += String.fromCharCode(parseInt(code, 16)); 
    } 
    return string; 
} 

試用演示:http://jsfiddle.net/hGKAg/3/

+0

我無法真正使用'8.752161808888254e + 25'(我從進入'Hello World'時得到的) –

+0

@ B1KMusic - 我更新了答案。既然你不介意十六進制,這應該可以解決你的問題。 –

+0

嗯,當我將十六進制字符串轉換回十進制時,我仍然得到了'8.752161808888254e + 25'。 –

1

雖然我已經從來沒有使用過這個,我的一個朋友給這個圖書館一個咕d審查。顯然,你可以使用任何基本標準與此庫編碼字符串:

Nibbler.js

相關問題