---
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import { PlaintextBlock} from './'
|
||||
|
||||
export const preprocessPlaintextHex = (hexPlaintext: string): PlaintextBlock[] => {
|
||||
/**
|
||||
* @param {string} hexPlaintext - The plaintext to encrypt, as a hexadecimal string.
|
||||
* @returns {PlaintextBlock[]} Blocks of 128 bits representing the plaintext. Each block is a 4x4 column-major matrix.
|
||||
*/
|
||||
const blockSize = 16 // 128 bits = 16 bytes
|
||||
|
||||
// Convert the hex string into a byte array, where each pair of hex digits is a byte
|
||||
const byteArray = new Uint8Array(hexPlaintext.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16)))
|
||||
|
||||
// Loop through the byteArray and split it into 128-bit blocks
|
||||
const blocks: Uint8Array[] = []
|
||||
for (let i = 0;i < byteArray.length;i += blockSize) {
|
||||
const block = byteArray.slice(i, i + blockSize)
|
||||
|
||||
if (block.length < blockSize) {
|
||||
// Pad the block with zeroes
|
||||
const paddedBlock = new Uint8Array(blockSize)
|
||||
paddedBlock.set(block)
|
||||
blocks.push(paddedBlock)
|
||||
} else {
|
||||
blocks.push(block)
|
||||
}
|
||||
}
|
||||
|
||||
const plaintextBlocks: number[][][] = blocks.map(block => {
|
||||
// Block is a 128-bit array containing 16 8-bit integers.
|
||||
|
||||
const matrix: number[][] = [
|
||||
[0, 0, 0, 0],
|
||||
[0, 0, 0, 0],
|
||||
[0, 0, 0, 0],
|
||||
[0, 0, 0, 0],
|
||||
]
|
||||
|
||||
// Fill the matrix in column-major order, i.e., top-to-bottom + left-to-right
|
||||
for (let i = 0;i < blockSize;i++) {
|
||||
const row = i % 4
|
||||
const col = Math.floor(i / 4)
|
||||
matrix[row][col] = block[i]
|
||||
}
|
||||
|
||||
return matrix
|
||||
})
|
||||
|
||||
return plaintextBlocks
|
||||
}
|
||||
Reference in New Issue
Block a user