Bitmap 图片隐写术

2023-11-21  本文已影响0人  Afra55

在图片中加入一串加密文字,并且只能通过解码的形式看到这串文字。

[TOC]

图片写入文字

import android.graphics.Bitmap;
import android.graphics.Color;

public class Steganography {

    // 加密并嵌入文字到图片中
    public static Bitmap embedText(Bitmap originalImage, String textToHide, String password) {
        byte[] encryptedText = encryptText(textToHide, password);
        int[] pixels = new int[originalImage.getWidth() * originalImage.getHeight()];
        originalImage.getPixels(pixels, 0, originalImage.getWidth(), 0, 0, originalImage.getWidth(), originalImage.getHeight());

        // 在像素中嵌入加密后的文字
        for (int i = 0; i < encryptedText.length; i++) {
            int pixel = pixels[i];
            int red = Color.red(pixel);
            int newPixel = Color.argb(255, red, Color.green(pixel), Color.blue(pixel));
            pixels[i] = newPixel | ((encryptedText[i] & 0xFF) << 24);
        }

        Bitmap stegoImage = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), Bitmap.Config.ARGB_8888);
        stegoImage.setPixels(pixels, 0, originalImage.getWidth(), 0, 0, originalImage.getWidth(), originalImage.getHeight());
        return stegoImage;
    }

    // 解码并解密图片中隐藏的文字
    public static String extractText(Bitmap stegoImage, String password) {
        int[] pixels = new int[stegoImage.getWidth() * stegoImage.getHeight()];
        stegoImage.getPixels(pixels, 0, stegoImage.getWidth(), 0, 0, stegoImage.getWidth(), stegoImage.getHeight());

        // 从像素中提取加密后的文字
        byte[] extractedText = new byte[pixels.length];
        for (int i = 0; i < pixels.length; i++) {
            int alpha = (pixels[i] >> 24) & 0xFF;
            extractedText[i] = (byte) alpha;
        }

        return decryptText(extractedText, password);
    }

    // 使用AES加密算法加密文字
    private static byte[] encryptText(String text, String password) {
        // 在这里实现使用AES加密算法加密文字的逻辑
        // 返回加密后的字节数组
        return new byte[0];
    }

    // 使用AES加密算法解密文字
    private static String decryptText(byte[] encryptedText, String password) {
        // 在这里实现使用AES加密算法解密文字的逻辑
        // 返回解密后的文字
        return "";
    }
}

文字加密解密

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import android.util.Base64;

public class AES {

    private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
    private static final String KEY_ALGORITHM = "AES";
    private static final int KEY_SIZE = 128;
    private static final byte[] IV = "1234567890123456".getBytes();

    // 使用AES算法加密文字
    public static String encrypt(String text, String password) {
        try {
            // 生成密钥
            SecretKeySpec secretKey = new SecretKeySpec(getKeyBytes(password), KEY_ALGORITHM);

            // 初始化加密器
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);

            // 加密数据
            byte[] encryptedBytes = cipher.doFinal(text.getBytes());

            // 对加密结果进行Base64编码
            return Base64.encodeToString(encryptedBytes, Base64.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 使用AES算法解密文字
    public static String decrypt(String encryptedText, String password) {
        try {
            // 生成密钥
            SecretKeySpec secretKey = new SecretKeySpec(getKeyBytes(password), KEY_ALGORITHM);

            // 初始化解密器
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV);
            cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);

            // 对Base64编码的加密结果进行解码
            byte[] encryptedBytes = Base64.decode(encryptedText, Base64.DEFAULT);

            // 解密数据
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);

            return new String(decryptedBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 从密码中获取16字节的加密密钥
    private static byte[] getKeyBytes(String password) {
        byte[] keyBytes = new byte[KEY_SIZE / 8];
        byte[] passwordBytes = password.getBytes();
        System.arraycopy(passwordBytes, 0, keyBytes, 0, Math.min(passwordBytes.length, keyBytes.length));
        return keyBytes;
    }
}

在实际应用中,为了确保安全性,应该使用一个随机的 IV(初始向量)来提高加密强度。

上一篇 下一篇

猜你喜欢

热点阅读