实验二 电子传输系统安全-进展2

一、利用java程序实现文件加密

我们的文件在计算机中都是以二进制的形式存储,而Java中IO流(字节流和字符流)可以实现对底层文件的读取,故利用Java的IO流进行文件拷贝时,可以对底层二进制进行加密操作,随后通过解密操可以还原。
java代码:

package demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOSercet {
    public static void main(String[] args) throws IOException {
        decrypt("C:\\Users\\Dell\\Desktop\\原视频.avi");
    }

    //加密
    public static void secret(String str) throws IOException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(str));
        String [] s=str.split("\\.");
        BufferedOutputStream bos = new BufferedOutputStream(new
              FileOutputStream("C:\\Users\\Dell\\Desktop\\marden1."+s[1]));
        int n;
        long a=System.currentTimeMillis();
        while((n=bis.read())!=-1){
            bos.write(n+1);
        }
        long b=System.currentTimeMillis();
        bis.close();
        bos.close();
        System.out.println("加密拷贝成功!");
        System.out.println("加密用时:"+(b-a)+"ms");
    }

    //解密
    public static void decrypt(String str) throws IOException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(str));
        String [] s=str.split("\\.");
        BufferedOutputStream bos = new BufferedOutputStream(new
                     FileOutputStream("C:\\Users\\Dell\\Desktop\\marden2."+s[1]));
        int n;
        long a=System.currentTimeMillis();
        while((n=bis.read())!=-1){
            bos.write(n-1);
        }
        long b=System.currentTimeMillis();
        bis.close();
        bos.close();
        System.out.println("解密拷贝成功!");
        System.out.println("解密用时:"+(b-a)+"ms");
    }
}

二、编程实现HASH算法-摘要计算

1、封装HASH类

封装为一个类,支持多种计算算法,如下:
hash.h:

#ifndef HASH_H
#define HASH_H

#include <qobject>
#include <qmetaenum>
#include <qstring>
#include <qbytearray>
#include <openssl sha.h>

/**
 * @brief The HASH class
 * HASH&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x7C7B;&#xFF0C;&#x5305;&#x62EC;Sha&#x3001;Sha1&#x3001;Sha224&#x7B49;&#x3002;
 */
class HASH : public QObject
{
    Q_OBJECT

public:
    enum Mode
    {
        SHA1,
        SHA224,
        SHA256,
        SHA384,
        SHA512,
        RIPEMD160,
        MD5
    };
    Q_ENUM(Mode)

    HASH(Mode mode);

    void addData(const QByteArray &data);
    QByteArray result();

private:
    QString modeToString(Mode value);

private:
    Mode _mode;   ///<hash算法类型 qbytearray _data; <待加密数据 }; #endif hash_h < code></hash算法类型></openssl></qbytearray></qstring></qmetaenum></qobject>

HASH.cpp

#include "HASH.h"
#include <openssl evp.h>

/**
 * @brief HASH::HASH
 * @param mode HASH&#x7B97;&#x6CD5;&#x7C7B;&#x578B;
 */
HASH::HASH(Mode mode)
    :_mode(mode)
{
}

/**
 * @brief HASH::addData
 * &#x6DFB;&#x52A0;&#x5F85;&#x52A0;&#x5BC6;&#x6570;&#x636E;
 * @param data &#x6570;&#x636E;
 */
void HASH::addData(const QByteArray &data)
{
    _data = data;
}

/**
 * @brief HASH::result
 * &#x83B7;&#x53D6;&#x52A0;&#x5BC6;&#x7ED3;&#x679C;
 * @return &#x52A0;&#x5BC6;&#x7ED3;&#x679C;
 */
QByteArray HASH::result()
{
    OpenSSL_add_all_digests();

    const EVP_MD *md = nullptr;
    md = EVP_get_digestbyname(modeToString(_mode).toStdString().c_str());
    if(!md) // &#x4E0D;&#x652F;&#x6301;&#x7684;&#x683C;&#x5F0F;
    {
        return QByteArray();
    }

    unsigned char mdValue[EVP_MAX_MD_SIZE] = {0};
    unsigned int mdLen = 0;

    EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
    EVP_MD_CTX_init(mdctx);
    EVP_DigestInit_ex(mdctx, md, nullptr);
    EVP_DigestUpdate(mdctx, _data.data(), _data.size());
    EVP_DigestFinal_ex(mdctx, mdValue, &mdLen);
    EVP_MD_CTX_free(mdctx);

    QByteArray out((const char *)mdValue, mdLen);
    return out;
}

/**
 * @brief HASH::modeToString
 * Mode&#x578B;&#x679A;&#x4E3E;&#x503C;&#x8F6C;&#x5B57;&#x7B26;&#x4E32;
 * @param value &#x679A;&#x4E3E;&#x503C;
 * @return &#x5B57;&#x7B26;&#x4E32;
 */
QString HASH::modeToString(HASH::Mode value)
{
    QMetaEnum metaEnum = QMetaEnum::fromType<mode>();
    const char* key = metaEnum.valueToKey(value);
    Q_ASSERT(key != nullptr);
    return QString(key);
}
</mode></openssl>

2、测试代码

void createTestData(QByteArray& data, int size)
{
    data.resize(size);
    for (int i = 0; i < size; i++)
    {
        data[i] = i % 128;
    }
}

void testHash(const QByteArray& data)
{
    // Sha1
    HASH hash1(HASH::SHA1);
    hash1.addData(data);
    qDebug() << "SHA1:" << hash1.result().toHex();

    // Sha224
    HASH hash2(HASH::SHA224);
    hash2.addData(data);
    qDebug() << "SHA224:" << hash2.result().toHex();

    // Sha256
    HASH hash3(HASH::SHA256);
    hash3.addData(data);
    qDebug() << "SHA256:" << hash3.result().toHex();

    // Sha384
    HASH hash4(HASH::SHA384);
    hash4.addData(data);
    qDebug() << "SHA384:" << hash4.result().toHex();

    // Sha512
    HASH hash5(HASH::SHA512);
    hash5.addData(data);
    qDebug() << "SHA512:" << hash5.result().toHex();

    // Ripemd160
    HASH hash6(HASH::RIPEMD160);
    hash6.addData(data);
    qDebug() << "RIPEMD160:" << hash6.result().toHex();

    // Md5
    HASH hash7(HASH::MD5);
    hash7.addData(data);
    qDebug() << "MD5:" << hash7.result().toHex();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // &#x4EA7;&#x751F;1MB+3B&#x7684;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#xFF0C;&#x4E3A;&#x4E86;&#x4F7F;&#x8BE5;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#x957F;&#x5EA6;&#xFF0C;&#x4E0D;&#x4E3A;8&#x6216;16&#x7684;&#x6574;&#x6570;&#x500D;
    QByteArray data;
    createTestData(data, 1*1024*1024+3);

    // &#x6D4B;&#x8BD5;HASH
    testHash(data);

    return a.exec();
}

三、下周计划

1、设计将加密与摘要计算的算法封装进系统代码里
2、学习java调用其他加密算法(如SM3)的方法
3、web页面美化设计
4、小组讨论web安全性问题

Original: https://www.cnblogs.com/zzjjyy123/p/16325950.html
Author: 20191223张俊怡
Title: 实验二 电子传输系统安全-进展2

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585819/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球