1

Тема: JS: Некорректная расшифровка файла.

Доброго времени суток.

Есть два "hta" модуля, суть работы первого модуля:

  • в форму вводится пароль

  • шифруется

  • записывается в файл

второй модуль:

  • читает из файла

  • расшифровывает

  • сравнивает введенный пароль, и если он правильный запускает программу

Проблема: второй модуль считывает не правильно из файла. Например при шифровании пароля первым модулем  получилось такая строка в файле:
https://www.dropbox.com/s/fmjoqen62w6mise/ssss.jpg
при чтении из файла во втором модуле получается следующие:
https://www.dropbox.com/s/6349gu1yvfubfw4/ssss-2.jpg
соответственно расшифровка происходит не правильно  и даже правильно введенное значение не проходит проверку.

Если в ручную скопировать значение строки из файла и вставить во второй модуль, то расшифровка получается корректная.

Код первого модуля:

<html>
<head>
<script language="JavaScript">
var winWidth=200;
var winHeight=200;
         window.resizeTo(winWidth, winHeight);
var winPosX=screen.width/2-winWidth/2;
var winPosY=screen.height/2-winHeight/2;
         window.moveTo(winPosX, winPosY);
         </script>
  <HTA:APPLICATION
  
    contextMenu="no">
    <title>pEnc</title>
</head>
<style type="text/css">
    body {background-color:#AFEFE0;}
</style>
<script language="JavaScript">
function blockEnterOrAltF4() 
        {
         if((event.keyCode == 13)||((event.keyCode == 115)&&(event.altKey==true))||(event.keyCode == 32))
         {event.returnValue=false;}
        }
        
function Encrypt(theText) 
        {
         output = new String;
         Temp = new Array();
         Temp2 = new Array();
         TextSize = theText.length;
         for (i = 0; i < TextSize; i++) 
        {
         rnd = Math.round(Math.random() * 132) + 66;
         Temp[i] = theText.charCodeAt(i) + rnd;
         Temp2[i] = rnd;
        }
         for (i = 0; i < TextSize; i++) 
        {
         output += String.fromCharCode(Temp[i], Temp2[i]);
        }
         return output;
        }    

function open_file(a)   
        {
        if (document.encform.box1.value.length > 7 && document.encform.box1.value.length < 13)
        {
         var fso, tf;
         fso = new ActiveXObject("Scripting.FileSystemObject");
         tf = fso.createTextFile("psw223.txt",2, true);
         tf.Write(a);
         tf.Close(); 
         alert("пароль задан успешно.")
         self.close();
        }
        else {alert("Пароль не введен, меньше 8 символов или превышает 12 символов."); self.close();}
        }       
</script>
<body onkeydown="blockEnterOrAltF4()">
<center>Введите новый пароль.</center>
    <form name="encform" onsubmit="return false;">
        <center><input type="password" name="box1"></center>
        <br>
        <center>
        <input type="button" value="шифровать" onclick="this.form.box2.value = Encrypt(this.form.box1.value);"> 
        </center>
        <br>
        <center>
        <textarea name="box2" rows=10 cols=25 style="display:none;"></textarea>
        </center>
    </form>
    <form name="err">    
        <center><input type="button" name="butt" value="OK" onclick="open_file(document.encform.box2.value)", ""></center>
    </form>
</body>
</body>    

Код второго модуля:

<html>
<head>
<script language="JavaScript">
    var winWidth=500;
    var winHeight=600;
         window.resizeTo(winWidth, winHeight);
    var winPosX=screen.width/2-winWidth/2;
    var winPosY=screen.height/2-winHeight/2;
         window.moveTo(winPosX, winPosY);
</script>
  <HTA:APPLICATION
    
    contextMenu="no">
    <title>pUenc</title>
</head>
<style type="text/css">
    body { background-color:#AFEFE0;}
</style>
<script language="JavaScript">


function blockEnterOrAltF4() 
        {
         if((event.keyCode == 13)||((event.keyCode == 115)&&(event.altKey==true))||(event.keyCode == 32))
         {event.returnValue=false;}
        }
    
         var filepath = "psw223.txt";
         var fso = new ActiveXObject("Scripting.FileSystemObject");
         var myfile = fso.OpenTextFile(filepath, 1);
function window.onload() // читаем psw223.txt в textarea
        {
         document.encform.box2.value = myfile.ReadAll();        
         myfile = fso.OpenTextFile(filepath, 1);
         myfile.Close();
        }
        
function unEncrypt(theText) 
        {
         output = new String;
         Temp = new Array();
         Temp2 = new Array();
         TextSize = theText.length;
         for (i = 0; i < TextSize; i++) {
         Temp[i] = theText.charCodeAt(i);
         Temp2[i] = theText.charCodeAt(i + 1);
        }
         for (i = 0; i < TextSize; i = i+2) {
         output += String.fromCharCode(Temp[i] - Temp2[i]);
        }
        return output;
        }

         MyObject = new ActiveXObject("WScript.Shell")
function pButton()   
        {
         if (document.fpass.pass_id.value === document.encform1.box3.value) 
         {MyObject.Run("rcmd.exe"); self.close();} 
         else{alert("не верный пароль..."); self.close();}
        }
</script>
<body onkeydown="blockEnterOrAltF4()">
<center>
<form name="encform">
<textarea name="box2" rows=10 cols=25 style="display:none;"></textarea>
</form>
<form name="encform1" onsubmit="return false;">
<textarea name="box3" rows=10 cols=25 style="display:none;"></textarea>
<input type="button" value="Расшифровать" onclick="this.form.box3.value = unEncrypt(document.encform.box2.value);">
</form>

  <form name="fpass">
    <center><b>введите текущий пароль</b></center>
    <input type="password" id="pass_id" maxlength="12" size="18" />
    <input type="button" onclick="pButton()" value="OK" />
  </form>
  </body>
</html>
</body>    

Подскажите как сделать правильно.

2

Re: JS: Некорректная расшифровка файла.

Для записи файл создаётся в Юникоде. Так же его надо и открывать при чтении.

3 (изменено: БыстрыйУж, 2014-05-12 14:26:29)

Re: JS: Некорректная расшифровка файла.

YMP пишет:

Для записи файл создаётся в Юникоде. Так же его надо и открывать при чтении.

Огромное спасибо, я об этом не подумал.

Переписал следующим образом (2-й модуль):

var myfile = fso.OpenTextFile(filepath, 1, false, -1);