信息安全工程师-AES密码技术及XOR图像遮盖技术(JavaC++)
目錄
AES加密
編碼
異或XOR
加解密步驟
AES加密
從中可以知道對稱加密和公鑰密碼只能保護(hù)機(jī)密性,防止竊聽。
如果要完整性防篡改,需要用單向散列函數(shù)、消息認(rèn)證碼、數(shù)字簽名技術(shù)。
這里有個(gè)關(guān)于對稱加密的一個(gè)問題:
如這個(gè)問題:對稱加密如AES。如果一串密文。有人稍微修了下。用密鑰去解會不會解出亂碼,還是解密失敗?拿java測。稍微測了幾次是解密失敗。但會不會有解出亂碼的情況?
問了一些大佬,最后總結(jié)出2個(gè)答案:
①一個(gè)鑰匙(密鑰)只能開一把鎖(加密數(shù)據(jù))。但這樣就有一個(gè)問題既然是這樣的模式,那么這個(gè)AES,不就具備了一部分了簽名的能力,就可以防篡改了,比如https,最后是用了AES加密,那么這個(gè)數(shù)據(jù)用AES加密,是否能防篡改,而上圖中對稱加密只用來保障機(jī)密性。所以這個(gè)地方就有點(diǎn)矛盾了。
②亂碼和失敗都是有可能,關(guān)鍵看AES是那種加密模式,是如果修改數(shù)據(jù)的。如果是使用流模式加密,能解密,但解出來的都是亂碼。塊加密模式只要不修改最后一塊就能解密,解出來是亂碼,塊加密模式修改最后一個(gè)塊,填充校驗(yàn)失敗,不能解密。
這里我做了個(gè)實(shí)驗(yàn)如下代碼:
AES.java
Main.java
package cn.it1995.tool;import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer;public class Main {public static void main(String[] args) throws UnsupportedEncodingException {String content = "helloWorldHelloWorld111111111111111111111111";AES aes = new AES();byte[] encrypted = aes.encrypt(new String(content));byte[] decrypt = aes.decrypt(encrypted);System.out.println("encrypted:" + new String(encrypted));System.out.println("decrypt:" + new String(decrypt));System.out.println("----------------------------------");ByteBuffer bb = ByteBuffer.wrap(encrypted);byte[] cipher = new byte[32];bb.get(cipher, 0, 16);for(int i = 5; i < 10; i++){cipher[i] = 1;}for(int i = 0; i < 16; i++){cipher[16 + i] = encrypted[encrypted.length - 16 + i];}System.out.println("刪除(篡改)保留最后一塊:");System.out.println(new String(aes.decrypt(cipher)));} }運(yùn)行截圖:
?所以AES并不能防篡改。如果要防篡改需要用單向散列函數(shù)、消息認(rèn)證碼、數(shù)字簽名技術(shù)。
編碼
編碼:將現(xiàn)實(shí)世界中的東西映射為比特序列的操作。如midnight:
m->0110 1101
i->0110 1001
d->0110 0100
n->0110 1110
i->0110 1001
g->0110 0111
h->0110 1000
t->0111 0100
異或XOR
這個(gè)比較有意思以前的理解為相同為0,不同的為1,
這里看到了有人用棋盤翻轉(zhuǎn)的理解方式。
理解:0表示不翻轉(zhuǎn),1表示翻轉(zhuǎn)。
0 XOR 0 = 0;沒有翻轉(zhuǎn)
1 XOR 0 = 1;翻轉(zhuǎn)了1次
0 XOR 1 = 1;翻轉(zhuǎn)了1次
1 XOR 1 = 0;翻轉(zhuǎn)了2次
加解密步驟
A XOR B = C
C XOR B = A
一串?dāng)?shù)據(jù)與密鑰運(yùn)算,得到加密數(shù)據(jù),加密數(shù)據(jù)在與密鑰運(yùn)算獲取明文。
如下:
A:0100 1100
B:1010 1010
來計(jì)算一下:
A XOR B:
0100 1100
1010 1010
----------
1110 0110
結(jié)果 XOR B:
1110 0110
1010 1010
----------
0100 1100
這里有個(gè)結(jié)論:數(shù)據(jù)a異或數(shù)據(jù)b得到數(shù)據(jù)c,數(shù)據(jù)c再與數(shù)據(jù)數(shù)據(jù)b異或,可以得到數(shù)據(jù)a。
圖像是這樣的:
下面使用Qt來實(shí)現(xiàn)這個(gè)加密。
編程實(shí)例
程序運(yùn)行截圖如下:
先是一個(gè)蠟筆小新的彩色圖:
?下面是《山坡羊·潼關(guān)懷古》
?原理就是上面說的,通過這種方式實(shí)現(xiàn)圖片掩蓋。這里水印也可以這么搞。
工程如下:
源碼如下:
Widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;uchar *m_secPtr;uchar *m_xorPtr;uchar *m_retPtr; }; #endif // WIDGET_H?Widget.cpp
#include "Widget.h" #include "ui_Widget.h" #include <QImage> #include <QDebug> #include <QRandomGenerator>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QImage pix(":/tghg.png");uchar *oriPtr = pix.bits();int picSize = pix.sizeInBytes();m_secPtr = new uchar[picSize];m_xorPtr = new uchar[picSize];m_retPtr = new uchar[picSize];//生成密鑰圖片for(int i = 0; i < picSize; i++){m_secPtr[i] = QRandomGenerator::global()->bounded(256);}ui->originLabel->setPixmap(QPixmap::fromImage(pix));ui->secLabel->setPixmap(QPixmap::fromImage(QImage(m_secPtr, pix.width(), pix.height(), pix.format())));for(int i = 0; i < picSize; i++){m_xorPtr[i] = oriPtr[i] ^ m_secPtr[i];}ui->xorLabel->setPixmap(QPixmap::fromImage(QImage(m_xorPtr, pix.width(), pix.height(), pix.format())));//還原for(int i = 0; i < picSize; i++){m_retPtr[i] = m_xorPtr[i] ^ m_secPtr[i];}ui->retLabel->setPixmap(QPixmap::fromImage(QImage(m_retPtr, pix.width(), pix.height(), pix.format()))); }Widget::~Widget() {delete ui;delete this->m_retPtr;delete this->m_secPtr;delete this->m_xorPtr; }main.cpp
#include "Widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }源碼打包下載地址:
Qt/XorPic at master · fengfanchen/Qt · GitHub
總結(jié)
以上是生活随笔為你收集整理的信息安全工程师-AES密码技术及XOR图像遮盖技术(JavaC++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fiddler工具杂记-将某些数据收集起
- 下一篇: Qt文档阅读笔记-QThreadPool