信息安全工程师-AES密码技术及XOR图像遮盖技术(JavaC++)
目录
AES加密
编码
异或XOR
加解密步骤
AES加密
从中可以知道对称加密和公钥密码只能保护机密性,防止窃听。
如果要完整性防篡改,需要用单向散列函数、消息认证码、数字签名技术。
这里有个关于对称加密的一个问题:
如这个问题:对称加密如AES。如果一串密文。有人稍微修了下。用密钥去解会不会解出乱码,还是解密失败?拿java测。稍微测了几次是解密失败。但会不会有解出乱码的情况?
问了一些大佬,最后总结出2个答案:
①一个钥匙(密钥)只能开一把锁(加密数据)。但这样就有一个问题既然是这样的模式,那么这个AES,不就具备了一部分了签名的能力,就可以防篡改了,比如https,最后是用了AES加密,那么这个数据用AES加密,是否能防篡改,而上图中对称加密只用来保障机密性。所以这个地方就有点矛盾了。
②乱码和失败都是有可能,关键看AES是那种加密模式,是如果修改数据的。如果是使用流模式加密,能解密,但解出来的都是乱码。块加密模式只要不修改最后一块就能解密,解出来是乱码,块加密模式修改最后一个块,填充校验失败,不能解密。
这里我做了个实验如下代码:
AES.java
package cn.it1995.tool;import javax.crypto.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;public class AES {private SecretKey mKey;public AES(){try {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");//创建随机密码,并设置种子SecureRandom secureRandom = new SecureRandom();secureRandom.setSeed(System.currentTimeMillis());//初始化密钥对象keyGenerator.init(128, secureRandom);mKey = keyGenerator.generateKey();}catch (NoSuchAlgorithmException e) {e.printStackTrace();}}public byte[] encrypt(String content){if(mKey == null){return new byte[]{-1};}try {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, mKey);return cipher.doFinal(content.getBytes());}catch (NoSuchAlgorithmException e) {e.printStackTrace();}catch (NoSuchPaddingException e) {e.printStackTrace();}catch (BadPaddingException e) {e.printStackTrace();}catch (IllegalBlockSizeException e) {e.printStackTrace();}catch (InvalidKeyException e) {e.printStackTrace();}return new byte[]{-1};}public byte[] decrypt(byte[] content){if(mKey == null){return new byte[]{-1};}try {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, mKey);return cipher.doFinal(content);}catch (NoSuchAlgorithmException e) {e.printStackTrace();}catch (NoSuchPaddingException e) {e.printStackTrace();}catch (BadPaddingException e) {e.printStackTrace();}catch (IllegalBlockSizeException e) {e.printStackTrace();}catch (InvalidKeyException e) {e.printStackTrace();}return new byte[]{-1};}
}
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)));}
}
运行截图:
所以AES并不能防篡改。如果要防篡改需要用单向散列函数、消息认证码、数字签名技术。
编码
编码:将现实世界中的东西映射为比特序列的操作。如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
这个比较有意思以前的理解为相同为0,不同的为1,
这里看到了有人用棋盘翻转的理解方式。
理解:0表示不翻转,1表示翻转。
0 XOR 0 = 0;没有翻转
1 XOR 0 = 1;翻转了1次
0 XOR 1 = 1;翻转了1次
1 XOR 1 = 0;翻转了2次
加解密步骤
A XOR B = C
C XOR B = A
一串数据与密钥运算,得到加密数据,加密数据在与密钥运算获取明文。
如下:
A:0100 1100
B:1010 1010
来计算一下:
A XOR B:
0100 1100
1010 1010
----------
1110 0110
结果 XOR B:
1110 0110
1010 1010
----------
0100 1100
这里有个结论:数据a异或数据b得到数据c,数据c再与数据数据b异或,可以得到数据a。
图像是这样的:
下面使用Qt来实现这个加密。
编程实例
程序运行截图如下:
先是一个蜡笔小新的彩色图:
下面是《山坡羊·潼关怀古》
原理就是上面说的,通过这种方式实现图片掩盖。这里水印也可以这么搞。
工程如下:
源码如下:
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
信息安全工程师-AES密码技术及XOR图像遮盖技术(JavaC++)相关推荐
- OpenCV精进之路(十六):图像分解和融合技术——图像拼接和图像融合技术
图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要. 再举一个身边的例子吧,你用你的手 ...
- 打算参加安全方面工作,信息安全工程师怎么样,软考考试需要怎么准备?
信息安全工程师是属于软考中级的一个科目,只需要考两科.信息安全工程师是近几年新开的一门考试,属于"信息系统"专业. 软考中级信息安全工程师考两科: 上午科目一:信息安全基础知识,1 ...
- 计算机图形设计论文 真实图形生成技术的发展,绘制技术论文,关于计算机图形图像绘制技术的现状应用相关参考文献资料-免费论文范文...
导读:这是一篇与绘制技术论文范文相关的免费优秀学术论文范文资料,为你的论文写作提供参考. (四川建筑职业技术学院,德阳618000) (Sichuan College of Architectural ...
- 计算机技术中的图像融合,多传感器图像融合技术的应用及发展趋势
彭硕玲 摘 要:多传感器图像融合技术是将多个传感器在相同时间下所取得的有关某个实际场景的图像或者相应的序列信息进行综合,形成一个全新的有关该场景的阐述,而这个阐述无法利用单一传感器来获取.通过将多个 ...
- 信息安全工程师考试大纲-科目2:信息安全应用技术
考试科目2:信息安全应用技术 扫一扫加入信息安全工程师备考群 1.密码学应用 1.1 密码算法的实现 * 了解DES/3DES密码算法的软件实现 * 了解AES密码算法的软件实现 * 了解S ...
- 【软考】 信息安全工程师教程 第六章 认证技术原理与应用
目录 6.1 认证概述 6.1.1 认证概念 6.1.2 认证依据 6.1.3 认证原理 6.1.4 认证发展 6.2 认证类型与认证过程 6.2.1 单向认证 6.2.2 双向认证 6.2.3 第三 ...
- (软考中级--信息安全工程师)六、认证技术原理与应用
目录 6.1.认证概述 6.1.1.认证概念 6.1.2.认证依据 6.1.4.认证发展 6.2.认证过程与认证授权 6.2.1.单向认证 6.2.2.双向认证 6.2.3.第三方认证 6.3.认证技 ...
- 【15章】网络安全主动防御技术与应用(信息安全工程师)-- 软考笔记
第15章 网络安全主动防御技术与应用 15.1 入侵阻断技术与应用 入侵阻断是网络安全主动防御的技术方法,其基本原理是通过对目标对象的网络攻击行为进行阻断,从而达到保护目标对象的目的. 15.1.1 ...
- 【第13章】网络安全漏洞防护技术原理与应用(信息安全工程师 )-- 软考笔记
第13章 网络安全漏洞防护技术原理与应用 13.1 网络安全漏洞概述 13.1.1 网络安全漏洞概念 网络安全漏洞又称为脆弱性,简称漏洞.漏洞一般是致使网络信息系统安全策略相冲突的缺陷,这种缺陷通常称 ...
最新文章
- 四. RxJava之基本原理
- 深度学习核心技术精讲100篇(四十二)-Seq2seq框架下的文本生成
- MAC 下SVN 删除文件失败 提示emains in tree-conflict
- Axure--Web原型开发工具
- 笔记-项目人力资源管理-复习要点
- Java GUI中实现文件拷贝
- (一) shario教程资料
- CSS定位总结:position=static/relative/absolute/fixed时的区别、top/bottom/left/right与margin外边距的运用
- 关于MySqlConnection的一个特殊异常
- 作者:李建平(1976-),男,博士,中国科学院科技战略研究院系统分析与管理所研究员、所长...
- Centos 6安装完美搭建mysql、php、apache之旅
- Linux Socket C语言网络编程:SCTP Socket
- 修改Azure Website默认时区
- windows服务器远程端口,查看和修改Windows服务器远程桌面的默认端口
- 基于粒子群优化算法的函数寻优算法
- 为什么成为CISSP持证专家?
- GATK / 体细胞短变异检测工具Mutect2的使用
- Python 救救我!如何连接串口实现一个报警灯报警器
- 蓝桥杯刷题冲刺 | 倒计时28天
- scons 手册_SCons用户手册 | 学步园