Languages
[Edit]
PL

JavaScript - szyfr z kluczem jednorazowym przy u┼╝yciu XOR

8 points
Created by:
Wayne
295

W tym kr├│tkim artykule, chcieliby┼Ťmy przedstawi─ç prost─ů, bazuj─ůc─ů na XOR, implementacj─Ö szyfru z kluczem jednorazowym w j─Özyku JavaScript.

Wykorzystywana formuła XOR:

Szyfrowanie:

     00110100  bajt wej┼Ťciowy
XOR  11000111  sekretny klucz
     --------
     11110011  zaszyfrowany bajt

Deszyfrowanie:
	 
	 11110010  zaszyfrowany bajt
XOR  11000111  sekretny klucz
     --------
     11110011  Deszyfrowany bajt == bajt wej┼Ťciowy

 

Szybkie rozwi─ůzanie:

1. szyfrowanie pojedyńczego bajtu

// ONLINE-RUNNER:browser;

const inputByte = 97;
const secretKey = 238; // losowy bajt uzyty jako sekretny klucz

const encryptedByte = inputByte ^ secretKey;     // Szyfrowanie
const decryptedByte = encryptedByte ^ secretKey; // Deszyfrowanie

console.log(inputByte);      // 97
console.log(encryptedByte);  // 143
console.log(decryptedByte);  // 97

2. szyfrowanie wielu bajt├│w

// ONLINE-RUNNER:browser;

const inputBytes = [97, 98, 99];    // reprezentuje ci─ůg 'abc', gdy u┼╝ywamy kodowania UTF-8
const secretKeys = [238, 203, 230]; // 3 losowe bajty uzyte jako sekretny klucz

// Szyfrowanie:

const encryptedBytes = Array(inputBytes.length);
for (let i = 0; i < inputBytes.length; ++i) {
  	encryptedBytes[i] = inputBytes[i] ^ secretKeys[i];
}

// Deszyfrowanie:

const decryptedBytes = Array(encryptedBytes.length);
for (let i = 0; i < encryptedBytes.length; ++i) {
  	decryptedBytes[i] = encryptedBytes[i] ^ secretKeys[i];
}

console.log(inputBytes);      // [97, 98, 99]
console.log(encryptedBytes);  // [143, 169, 133]
console.log(decryptedBytes);  // [97, 98, 99]

 

Opis algorytmu

Algorym ten jest tak silny jak perfekcyjne s─ů liczby losowe u┼╝yte jako klucze prywatne.

Koncepcja szyfru z kluczem jednorazowym opiera się na:

  1. u┼╝yciu formu┼éy XOR na elementarnych porcjach danych (w naszym przypadku s─ů to bajty),

    Wskaz├│wka: sprawd┼║ znajduj─ůc─ů si─Ö na ko┼äcu artyku┼éu┬áreferencj─Ö do Wikipedi,┬áaby pozna─ç inne mo┼╝liwe formu┼éy szyfrowania danych po za XOR.

  2. przechowywaniu┬ásekretnych kluczy na urz─ůdzeniu┬ánadawcy┬ái┬áodbiorcy,┬ásk┼éadaj─ůcych si─Ö z perfekcyjnych liczb losowych┬á(liczy losowe wygenerowane przez popularne algorytmy mog─ů by─ç przewidywalne, wi─Öc warto u┼╝y─ç innych metod bazuj─ůcych np.┬ána naturze),
  3. nieudost─Öpnianiu┬ánikomu liczb losowych┬ápo za┬ánadawc─ů i odbiorc─ů,
  4. u┼╝ywaniu zawsze tylko cz─Ö┼Ťci sekretnych kluczy do szyforwania i deszyfrowania przesy┼éanych wiadomo┼Ťci┬á(jeden bajt szyfrowany przez jeden sekretny klucz),
  5. nie u┼╝ywaniu nigdy skeretnego klucz wi─Öcej ni┼╝ raz.

Uniwersalna implementacja

Poni┼╝szy program przechowuje┬áinformacj─Ö o ostatnim sekretnym kluczu,┬ákt├│ry zosta┼é u┼╝yty do szyfrowania i deszyfrowania, chroni─ůc przd z┼éamaniem zasady 5 (nie u┼╝ywaniu nigdy skeretnego klucz wi─Öcej ni┼╝ raz).

// ONLINE-RUNNER:browser;

// Szyfr z kluczem jednorazowym przy uzyciu XOR

const Cipher = (secretKeys) => {
  	const createScope = () => {
    	let secretOffset = 0;
        const execute = (inputBytes) => {
            if (secretOffset + inputBytes.length > secretKeys.length) {
                throw new Error('There is not enought secret keys to encode / decode bytes.');
            }
            const outputBytes = Array(inputBytes.length);
            for (let i = 0; i < inputBytes.length; i += 1, secretOffset += 1) {
                outputBytes[i] = secretKeys[secretOffset] ^ inputBytes[i];
            }
            return outputBytes;
        };
      	return execute;
    };
  	return {
    	encrypt: createScope(),
      	decrypt: createScope()  // do deszyfrowania uzywamy tej r├│wnie┼╝ funkcji szyfruj─ůcej
    };
};


// Przykład uzycia:

// wsp├│lna cz─Ö┼Ť─ç - informacje, kt├│re znaj─ů si─Ö u nadawcy i odbiorcy

// dla poni┼╝szego przyk┼éadu u┼╝ywamy zwyk┼éych liczb losowych - pami─Ötaj, aby by┼éy one z zakresu od 0 do 255 (w┼é─ůcznie)
const secretKeys = [238, 203, 230, 91, 223, 161, 59, 10, 105, 200, 45, 145, 64, 145, 210]; // sekwencja liczb losowych u┼╝yta jako sekretny klucz


// nadawca

const senderCipher = Cipher(secretKeys);

const encryptedBytes1 = senderCipher.encrypt([97, 98, 99]); // reprezentuje ci─ůg 'abc', gdy u┼╝ywamy kodowania UTF-8
const encryptedBytes2 = senderCipher.encrypt([49, 50, 51]); // reprezentuje ci─ůg '123', gdy u┼╝ywamy kodowania UTF-8
const encryptedBytes3 = senderCipher.encrypt([97, 98, 99]); // reprezentuje ci─ůg 'abc', gdy u┼╝ywamy kodowania UTF-8

console.log(`Szyfrowanie 1: ${encryptedBytes1}`);  // Szyfrowanie 1: [143, 169, 133]
console.log(`Szyfrowanie 2: ${encryptedBytes2}`);  // Szyfrowanie 2: [106, 237, 146]
console.log(`Szyfrowanie 3: ${encryptedBytes3}`);  // Szyfrowanie 3: [90, 104, 10]


// odbiorca

const recipientCipher = Cipher(secretKeys);

const decryptedBytes1 = recipientCipher.decrypt(encryptedBytes1);
const decryptedBytes2 = recipientCipher.decrypt(encryptedBytes2);
const decryptedBytes3 = recipientCipher.decrypt(encryptedBytes3);

console.log(`Deszyfrowanie 1: ${decryptedBytes1}`);  // Deszyfrowanie 1: [97, 98, 99]
console.log(`Deszyfrowanie 2: ${decryptedBytes2}`);  // Deszyfrowanie 2: [49, 50, 51]
console.log(`Deszyfrowanie 3: ${decryptedBytes3}`);  // Deszyfrowanie 3: [97, 98, 99]

Wnioski:

  • [97, 98, 99] zakodowany 2 razy zwr├│ci┼é┬á2 r├│┼╝ne wyniki: [143, 169, 133]┬áoraz┬á[90, 104, 10]┬á- jest to zagwarantowane┬ápoprzez jednorazowe u┼╝ycie ka┼╝dego klucza, kt├│ry jest liczb─ů losow─ů.

 

Alternatywan implementacja

const maskBytes = (offset, key, bytes) => {
	const result = Array(bytes.length);
	for (let i = 0; i < bytes.length; ++i) {
		result[i] = key[offset + i] ^ bytes[i];
	}
	return result;
};

const Cipher = (secret) => {
	let offset = 0;
	const execute = (bytes) => {
		if (offset + bytes.length > secretSequence.length) {
			throw new Error('There is not enought numbers in the secret sequence to encode / decode bytes.');
		}
		const result = maskBytes(offset, secret, bytes);
		offset += result.length;
		return result;
	};
	return {
		encrypt: execute,
		decrypt: execute
	};
};

Zobacz r├│wnie┼╝

  1. JavaScript - convert string to bytes array

  2. JavaScript - convert string to bytes array under Node.js

Odno┼Ťniki

  1. Szyfr z kluczem jednorazowym - Wikipedia
Native Advertising
­čÜÇ
Get your tech brand or product in front of software developers.
For more information Contact us
Dirask - we help you to
solve coding problems.
Ask question.

ÔŁĄ´ŞĆ­čĺ╗ ­čÖé

Join