首页
社区
课程
招聘
一个基于均态分布随机数算法(非正态分布/高斯分布随机数算法)实现香农一位一密加解密的程序源码
2019-7-3 21:17 11325

一个基于均态分布随机数算法(非正态分布/高斯分布随机数算法)实现香农一位一密加解密的程序源码

2019-7-3 21:17
11325

这是一个基于均态分布随机数算法(非正态分布/高斯分布随机数算法)实现香农一位一密加解密的程序源码。

加解密速率很快,可以用于信息实时安全传输,估计超级计算机也破解不了。

这是本人改造/改良/改进的成果(一位一密是香农首创独创),如果你发现网上早有别人实现了同样的程序,请告知本人。

欢迎各路加解密精英高手破解,如果你破解了,也请告知本人,万分感谢!    因为你破解了,也就是破解了信息学/信息论鼻祖香农首创也是独创的一位一密加解密算法,你就是个天才。

我开源的目的就是要结识你这样的加解密天才。


这是在 macOS Mojave 下用 gcc 64位版本编译通过,Linux 和 BSD 都通用,Windows 下用 Visual Studio 2019 64位版本编译通过。

用法

加密:OneBitOneCipher plaintext ciphertext password

解密:OneBitOneCipher ciphertext plaintext password

如果排版不清楚,请下载附件 C 源码。


#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

// 这个头文件 Windows 下不用

#include <unistd.h>

//  Windows 下要用的头文件

//#include <io.h>

//#include <share.h>

int main(int argc, char *argv[])

{

    struct stat statFileSize;

    stat(argv[1], &statFileSize);

    unsigned long ulFileSize = statFileSize.st_size;

    unsigned char *pucPlaintext_Cyphertext = malloc(ulFileSize);

//  Windows 改用这里

/*

    struct _stat statFileSize;

    _stat(argv[1], &statFileSize);

    unsigned int uiFileSize = statFileSize.st_size;

    unsigned char *pucPlaintext_Cyphertext = (unsigned char*)malloc(uiFileSize);

*/

    unsigned long ulPlaintext_CyphertextFD = open(argv[1], O_RDONLY, S_IRUSR | S_IWUSR);

    unsigned long ulCyphertext_PlaintextFD = open(argv[2], O_CREAT | O_WRONLY, S_IREAD | S_IWRITE);

//  Windows 改用这里

/*

    int iPlaintext_CyphertextFD, iCyphertext_PlaintextFD;

    _sopen_s(&iPlaintext_CyphertextFD, argv[1], _O_RDONLY, _SH_DENYWR, _S_IREAD);

    _sopen_s(&iCyphertext_PlaintextFD, argv[2], _O_CREAT | O_WRONLY, _SH_DENYNO, S_IWRITE);

*/

    read(ulPlaintext_CyphertextFD, pucPlaintext_Cyphertext, ulFileSize);

//  Windows 改用这里

/*

    _read(iPlaintext_CyphertextFD, pucPlaintext_Cyphertext, uiFileSize);

*/

    unsigned long i, j;

// 至少8个可打印字符的密码(包括空格),最多16个。

    unsigned char aucPassword[16], aucKeyTable[256];

    for(i = 0; i < 256; ++i)

    {

Loop:

        aucKeyTable[i] = rand() & 255;

        for(j = 0; j < i; ++j)

        {

            if(aucKeyTable[j] == aucKeyTable[I])

            {

               goto Loop;

            }

        }

    }

    for(i = 0; argv[3][i]; ++i)

    {

        aucPassword[i] = argv[3][I];

    }

    srand(*((unsigned int*)aucPassword) % RAND_MAX);

    for(j = 0; j < ulFileSize; j += 256)

    {

        unsigned long k, l, ulTablePosition;

        for(k = 0; k < i; ++k)

        {

            ulTablePosition = aucPassword[k] % 256;

            aucPassword[k] = aucKeyTable[ulTablePosition];

        }

        if(!(j /256 % 2))

        {

            unsigned long *pulKeySwap1 = (unsigned long*)aucKeyTable, *pulKeySwap2 = (unsigned long*)aucKeyTable, ulKeyTemp;

            for(l = 0; l < 32; ++l)

            {

                ulTablePosition = aucPassword[l] % 32;

                if(l != ulTablePosition)

                {

                    ulKeyTemp = pulKeySwap1[l];

                    pulKeySwap1[l] = pulKeySwap2[ulTablePosition];

                    pulKeySwap2[ulTablePosition] = ulKeyTemp;

                }

            }

        }

        else

        {

            for(k = 0; k < 256; ++k)

            {

                ulTablePosition = rand() % 256;

                if(k != ulTablePosition)

                {

                    aucKeyTable[k] += aucKeyTable[ulTablePosition];

                    aucKeyTable[ulTablePosition] = aucKeyTable[k] - aucKeyTable[ulTablePosition];

                    aucKeyTable[k] -= aucKeyTable[ulTablePosition];

                }

            }

        }

        for(l = 0; l < 256 && j + l < ulFileSize; ++l)

        {

            pucPlaintext_Cyphertext[j + l] ^= aucKeyTable[l];

        }

    }

    write(ulCyphertext_PlaintextFD, pucPlaintext_Cyphertext, ulFileSize);

    close(ulCyphertext_PlaintextFD);

    close(ulPlaintext_CyphertextFD);

//  Windows 改用这里

/*

    _write(iCyphertext_PlaintextFD, pucPlaintext_Cyphertext, uiFileSize);

    _close(iCyphertext_PlaintextFD);

    _close(iPlaintext_CyphertextFD);

*/

    return 0;

}


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2020-7-5 08:56 被zx_838914编辑 ,原因: 更新内容
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (7)
雪    币: 6257
活跃值: (3152)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhatian 2019-7-4 00:34
2
0
瘟到死报错
雪    币: 6257
活跃值: (3152)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhatian 2019-7-4 00:38
3
0
瘟到死 有问题。
雪    币: 324
活跃值: (104)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
lancier 2019-7-4 00:43
4
0
目前疯狂取伪随机数的方法一般用于不了实时通信吧。aucPassword[]和pucPlaintext_Cyphertext[]数组越界,而且为什么交换数组元素还要写两种方法...
雪    币: 108
活跃值: (1188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zx_838914 2019-7-6 08:34
5
0
zhatian 瘟到死报错
// 在 Windows7 64位系统下用 Visual Studio 2013 64位版本编译通过
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    struct _stat statFileSize;

    _stat(argv[1], &statFileSize);

    unsigned int uiFileSize = statFileSize.st_size;

    unsigned char *pucPlaintext_Cyphertext = (unsigned char*)malloc(uiFileSize);

    int iPlaintext_CyphertextFD, iCyphertext_PlaintextFD;

    _sopen_s(&iPlaintext_CyphertextFD, argv[1], _O_RDONLY, _SH_DENYWR, _S_IREAD);

    _sopen_s(&iCyphertext_PlaintextFD, argv[2], _O_CREAT | O_WRONLY, _SH_DENYNO, S_IWRITE);

    _read(iPlaintext_CyphertextFD, pucPlaintext_Cyphertext, uiFileSize);

    unsigned long long i, j;

// 密码至少8个可打印字符(包括空格),最多16个。
    unsigned char aucPassword[16], aucKeyTable[256];

    for(i = 0; i < 256; ++i)
    {
Loop:
        aucKeyTable[i] = rand() & 255;

        for(j = 0; j < i; ++j)
        {
            if(aucKeyTable[j] == aucKeyTable[i])
            {
                goto Loop;
            }
        }
    }

    for(i = 0; argv[3][i]; ++i)
    {
        aucPassword[i] = argv[3][i];
    }

    srand(*((unsigned int*)aucPassword) % RAND_MAX);

    for(j = 0; j < uiFileSize; j += 256)
    {
        unsigned long long k, l, ulTablePosition;

        for(k = 0; k < i; ++k)
        {
            ulTablePosition = aucPassword[k] % 256;

            aucPassword[k] = aucKeyTable[ulTablePosition];
        }

        if(!(j / 256 % 2))
        {
            unsigned long long *pulKeySwap1 = (unsigned long long*)aucKeyTable, *pulKeySwap2 = (unsigned long long*)aucKeyTable, ulKeyTemp;

            for(l = 0; l < 32; ++l)
            {
                ulTablePosition = aucPassword[l] % 32;

               if(l != ulTablePosition)
                {
                    ulKeyTemp = pulKeySwap1[l];

                    pulKeySwap1[l] = pulKeySwap2[ulTablePosition];

                    pulKeySwap2[ulTablePosition] = ulKeyTemp;
                }
            }
        }
        else
        {
            for(k = 0; k < 256; ++k)
            {
                ulTablePosition = rand() % 256;

                if(k != ulTablePosition)
                {
                    aucKeyTable[k] += aucKeyTable[ulTablePosition];

                    aucKeyTable[ulTablePosition] = aucKeyTable[k] - aucKeyTable[ulTablePosition];

                    aucKeyTable[k] -= aucKeyTable[ulTablePosition];
                }
            }
        }

        for(l = 0; l < 256 && j + l < uiFileSize; ++l)
        {
            pucPlaintext_Cyphertext[j + l] ^= aucKeyTable[l];
        }
    }

    _write(iCyphertext_PlaintextFD, pucPlaintext_Cyphertext, uiFileSize);

    _close(iCyphertext_PlaintextFD);

    _close(iPlaintext_CyphertextFD);

    return 0;
}
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhtddd 2019-7-9 17:05
6
0
你这个算法的思想不算第一个啦,我现在就在用。已经用了几年了。所用思想无非就是伪随机序列在给定种子时是确定的,但是根据随机值无法推出种子是什么。而且你这个算法有致命的缺陷。
雪    币: 6257
活跃值: (3152)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhatian 2019-7-18 03:07
7
0
宇宙钝胎 // 在 Windows7 64位系统下用 Visual Studio 2013 64位版本编译通过 #include #include #include #include #inc ...
这 稳道士 的算法确实叼。  加密之后无法解密,浪费我的时间。 写的什么垃圾玩意。
雪    币: 108
活跃值: (1188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zx_838914 2020-7-5 08:59
8
0
zhtddd 你这个算法的思想不算第一个啦,我现在就在用。已经用了几年了。所用思想无非就是伪随机序列在给定种子时是确定的,但是根据随机值无法推出种子是什么。而且你这个算法有致命的缺陷。
啥至命缺陷,请教一下。
游客
登录 | 注册 方可回帖
返回