Что нового

[Криптография] XOR Шифрование текста

Microteam

Осваивающий
Сообщения
74
Репутация
34
Вот ребят представляю Вам, очень простой алгоритм шифрования. Я надеюсь, что большинство поймёт его реализацию. Этот алгоритм базируется на операции XOR (XOR-шифрование)(исключающее ИЛИ, деление по модулю 2). Можно описать XOR так: Это или то, но не всё разом. То есть:

1 XOR 0 = 1 Это
0 XOR 0 = 0
0 XOR 1 = 1 Или то
1 XOR 1 = 0 но не всё разом

Как видите если в левой или правой части есть 1, то будет 1, а если в обоих 0, то будет ноль. И если в обоих 1, то будет 0. То есть, если везде 1, то будет 0. (не всё разом :smile:)

Итак, вернёмся к нашему алгоритму. Это будет симметричный алгоритм, т.е шифрует и расшифровывает 1 ключ. Скажем что у нас есть буква, которую надо зашифровать, и пусть это буква будет R. Также у нас есть ключ, пусть ключ тоже будет буквой, но уже другой. Скажем буква D. В итоге:
Буква = R
Ключ = D

Теперь попробуем операцией XOR зашифровать букву R, буквой D. Узнаем ASCII коды этих букв.
Двоичный код буквы R: 01010010
Двоичный код буквы D: 01000100

Итак, шифруем:
01010010
01000100
00010110 - зашифрованная буква.

В общем, у нас есть 00010110 - это зашифрованная буква R, буквой D. А ещё точнее, это шифротекст.

Итак, давайте же попробуем расшифровать обратно. Применяем тот же алгоритм, но уже для шифротекста:
00010110 - шифротекст
01000100 - ключ
01010010 - расшифрованный текст.

Ой! Что мы видим? Двоичный код буквы R. Мы расшифровали букву. А давайте же, попробуем расшифровать другим ключом. Пусть новый ключ у нас будет, буква W.

Двоичный код буквы W: 01010111

Расшифровываем:
00010110 - шифротекст
01010111 - ключ (буква W).
01000001 - расшифрованная буква.

Теперь сравниваем код буквы R и код выше:
Код буквы R: 01010010
Код выше 01000001

Как видите код буквы R и код выше, не сходятся. Значит ключ неправильный.

Т.к., в нашем алгоритме может быть в шифре и в ключе, присутствовать не одна буква, то мы каждую букву в исходном тексте, будем шифровать каждой буквой ключа. Например:
Есть у нас слово: FOO
И ключ: BAR

Сначала мы шифруем (^ - это обозначение XOR):
F ^ B
F ^ A
F ^ R
O ^ B
O ^ A
O ^ R
и т.д.

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

Реализуем на AutoIt:
Код:
Func CryptDecrypt($Data, $Key)
   if $Data = '' OR $Key = '' Then Return '';
	  
   ; Тут будет шифротекст
   $Crypted = '';
   
   $DLen = StringLen($Data); Длина исходного текста
   $KLen = StringLen($Key); Длина ключа
   
   ; Цикл перебирает каждую букву из исходного текста
   For $i = 1 To $DLen
	  $Char = StringMid($Data, $i, 1); Получаем букву
	  
	  $CharCode = Asc($Char); Узнаем её ASCII код
	  
	  $CryptedChar = $CharCode; Тут будет зашифрованная буква
	  
	  For $u = 1 To $KLen
		 $KeyChar = StringMid($Key, $u, 1); Получаем символ из ключа
		 
		 $KeyCharCode = Asc($KeyChar); Узнаем ASCII код
		 
		 $CryptedChar = BitXOR($CryptedChar, $KeyCharCode); Выполняем операцию XOR
	  Next
	  
	  $CryptedSymbol = Chr($CryptedChar); Получаем символ из шифра
	  
	  $Crypted &= $CryptedSymbol; Добавляем символ к шифротексту
   Next
   
   Return $Crypted
EndFunc



$text = 'Привет! Это бессмысленный текст.'; исходный текст
$pass = 'qwerty123'; ключ
MsgBox(0, '', 'Исходный текст: '& $text&@LF&'Ключ: '&$pass);
$CryptText = CryptDecrypt($text, $pass);
MsgBox(0, '', 'Зашифрованный текст: '&$CryptText);
$DecryptText = CryptDecrypt($CryptText, 'qwerty123')
MsgBox(0, '', 'Расшифрованный текст: '&$DecryptText);


Как видите текст успешно шифруется и расшифровывается. Я надеюсь, что Вы сейчас расширили свои познания в криптографии. Спасибо, что дочитали до конца :smile:.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ИМХО, так чуть-чуть надежней. :smile:
Код:
$sText = 'Привет! Это бессмысленный текст для _EnCryptDeCrypt()'
$sPass = 'AutoIt Version: 3.3.8.1'
MsgBox(64, 'Info', 'Исходный текст: ' & $sText & @LF & 'Ключ: ' & $sPass)
$sEnCryptText = _EnCryptDeCrypt($sText, $sPass);
MsgBox(64, 'Info', 'Зашифрованный текст: ' & $sEnCryptText);
$sDeCryptText = _EnCryptDeCrypt($sEnCryptText, $sPass)
MsgBox(64, 'Info', 'Расшифрованный текст: ' & $sDeCryptText);

Func _EnCryptDeCrypt($s_Data, $s_Key)
	If (Not $s_Data) Or (Not $s_Key) Then Return SetError(-1, 0, '')
	Local $a_Data, $a_Key, $s_Ret, $i_ChrW, $i_UbData, $i_UbKey

	$a_Data = StringToASCIIArray($s_Data)
	$i_UbData = UBound($a_Data)
	If Not $i_UbData Then Return SetError(1, 0, '')
	$a_Key = StringToASCIIArray($s_Key)
	$i_UbKey = UBound($a_Key)
	If Not $i_UbKey Then Return SetError(2, 0, '')
	For $i = 0 To $i_UbData - 1
		For $j = 0 To $i_UbKey - 1
			$i_ChrW = BitXOR($a_Data[$i], $a_Key[$j], ($i_UbKey - $j) * ($i_UbData - $i))
		Next
		$s_Ret &= ChrW($i_ChrW)
	Next
	Return $s_Ret
EndFunc   ;==>_EnCryptDeCrypt
 

timesoon1

Новичок
Сообщения
3
Репутация
0
Добрый день! Скажите пожалуйста, есть ли еще какие-либо готовые функции шифрования текста? Или как можно переделать эту функцию, чтоб при шифровании не использовались так называемые спец символы? Только буквы и цифры.
 
A

Alofa

Гость
timesoon1 сказал(а):
... есть ли еще какие-либо готовые функции шифрования текста?
_Crypt_EncryptData()
_Crypt_EncryptFile()


Добавлено:
Сообщение автоматически объединено:

timesoon1 сказал(а):
... Или как можно переделать эту функцию, чтоб при шифровании не использовались так называемые спец символы? Только буквы и цифры.
К примеру так :smile:
Код:
$sText = 'Привет! Это бессмысленный текст для _EnCryptDeCrypt()'
$sPass = 'AutoIt Version: 3.3.8.1'
$sEnCryptText = _EnCryptDeCrypt($sText, $sPass);
$sDeCryptText = _EnCryptDeCrypt($sEnCryptText, $sPass)
MsgBox(64, 'Info', 'Ключ: ' & $sPass & @LF & @LF & _
		'Исходный текст:' & @LF & $sText & @LF & @LF & _
		'Зашифрованный текст:' & @LF & $sEnCryptText & @LF & @LF & _
		'Расшифрованный текст:'& @LF & $sDeCryptText);

Func _EnCryptDeCrypt($s_Data, $s_Key)
	If (Not $s_Data) Or (Not $s_Key) Then Return SetError(-1, 0, '')
	Local $i_Bin, $a_Data, $a_Key, $s_Ret, $i_ChrW, $i_UbData, $i_UbKey
	If StringRegExp($s_Data, '^[[:xdigit:]]+$') Then
		$s_Data = BinaryToString('0x' & $s_Data, 2)
		$i_Bin = 1
	EndIf
	$a_Data = StringToASCIIArray($s_Data)
	$i_UbData = UBound($a_Data)
	If Not $i_UbData Then Return SetError(1, 0, '')
	$a_Key = StringToASCIIArray($s_Key)
	$i_UbKey = UBound($a_Key)
	If Not $i_UbKey Then Return SetError(2, 0, '')
	For $i = 0 To $i_UbData - 1
		For $j = 0 To $i_UbKey - 1
			$i_ChrW = BitXOR($a_Data[$i], $a_Key[$j], ($i_UbKey - $j) * ($i_UbData - $i))
		Next
		$s_Ret &= ChrW($i_ChrW)
	Next
	Return ($i_Bin) ? $s_Ret : StringTrimLeft(StringToBinary($s_Ret, 2), 2)
EndFunc   ;==>_EnCryptDeCrypt
 
Верх