Image Encryption Using a 6D Hyperchaotic System and DNA Encoding
Chaos-based image encryption algorithms are widely used across various industries, but many rely on low-dimensional chaotic systems, wich can compromise security due to limited key spaces and vulnerability to attacks. To address this, a novel image encryption method combining a 6D hyperchaotic system with DNA encoding is introduced. This approach enhances security by leveraging the complex dynamics of high-dimensional chaos and the biological properties of DNA sequences.
First, multiple chaotic sequences generated by the 6D hyperchaotic system are used to diffuse and scramble the pixel values of the original image. The image is preprocessed by converting it to a binary format and dividing it into 8x8 pixel blocks. Diffusion alters pixel values using chaotic sequences, while scrambling rearranges pixel positions within blocks.
Next, the scrambled blocks are transformed into DNA sequences based on encoding rules. Additional diffusion and scrambling operations are applied to these DNA sequences using different chaotic sequences to further obscure the data.
Finally, the processed DNA sequences are decoded and combined to reconstruct the encrypted image. Experimental evaluations demonstrate that this algorithm achieves high security with an entropy value close to 8, low pixel correlation, and a key space exceeding 2^300. It also shows strong robustness against geometric and cropping attacks.
function entropyValues = computeImageEntropy(imageData)
% This function calculates the entropy for each color channel of an image.
% Entropy measures randomness, with higher values indicating better encryption.
entropyValues = zeros(1, 3);
function channelEntropy = calculateChannelEntropy(channel)
channel = double(channel);
[rows, cols] = size(channel);
pixelVector = channel(:)';
probabilityDist = zeros(1, 256);
for intensity = 0:255
count = sum(pixelVector == intensity);
probabilityDist(intensity + 1) = count / (rows * cols);
end
nonZeroProbs = probabilityDist(probabilityDist > 0);
channelEntropy = -sum(nonZeroProbs .* log2(nonZeroProbs));
end
entropyValues(1) = calculateChannelEntropy(imageData(:, :, 1));
entropyValues(2) = calculateChannelEntropy(imageData(:, :, 2));
entropyValues(3) = calculateChannelEntropy(imageData(:, :, 3));
end