那些零零散散的算法

放些算法相关的东西

C++利用常量表达式在编译期操作字符串

在打log的时候,往往有这样的需求,要把当前代码文件的文件名打印出来。 最简单的就是输出__FILE__宏。但是__FILE__实际上是包括文件名的完整路径,比如这样:/tmp/blablabla-XXXX-YYYY-ZZZZZZ/example.cpp这样的输出太过冗长,我们需要的实际上只是e...

2017-09-29 09:23:00

阅读数 888

评论数 0

使用cuFFT实现大整数乘法

序言在某些场合,我们可能需要使用远超内置整型范围的整数进行运算,比如公钥加密等。如果使用最原始的竖式计算,那么时间复杂度是T(n^2),其中n是相乘的两个整数的位数。使用Karatsuba算法优化,时间复杂度可以降至T(n^{log_2 3})≈ T(n^1.585) 。而如果使用快速傅里叶变换(...

2017-08-23 17:53:59

阅读数 950

评论数 0

谈谈有限域那些事儿

在本人的其它博文中,介绍了主流的三种公钥加密算法:RSA、离散对数加密和椭圆曲线加密。出于可读性上的考虑,文章中尽量减少了代数相关的描述。实际上,这三者都是基于有限域的,如果能从抽象代数角度去解释,会更简洁。

2017-08-17 23:12:31

阅读数 7958

评论数 0

离散对数和椭圆曲线加密原理

序言 现代公钥加密系统中,常用的加密算法除了RSA还有离散对数加密和椭圆曲线加密。这两者原理比较相似,在这里一并介绍。 离散对数问题 我们在中学里学的对数问题是指, 给定正实数aaa和axaxa^x,求xxx。也就是计算x=logaaxx=loga⁡axx=\log_a{...

2017-08-03 11:35:05

阅读数 9485

评论数 5

红黑树原理简析

序言红黑树是一种应用十分广泛的平衡二叉搜索树。大部分语言和库中TreeMap的实现都是使用红黑树,还有Linux、Nginx等也使用了红黑树。 但是红黑树也是一种非常复杂的数据结构,为了保持平衡,在修改的时候必须进行维护操作,插入操作要分5种不同的情况来处理,而删除则有6种情况。 实际上,没有...

2017-07-15 17:21:36

阅读数 1232

评论数 0

数字签名原理及其应用

签名的作用无非就是证明某个文件上的内容确实是我写的/我认同的,别人不能冒充我的签名(不可伪造),我也不能否认上面的签名是我的(不可抵赖)。 我们知道,手写签名之所以不能伪造,是因为每一个人的笔迹都是独一无二的,即使模仿,也可以通过专家鉴定分别出来。而不能抵赖,是因为每个人的笔迹都有固定特征,这些...

2017-06-25 15:40:34

阅读数 35176

评论数 11

RSA算法之实现篇(Python版)

RSA中的密钥长度指的是公钥的长度,目前主流的公钥长度为1024、2048以及4096位。由于已经有768位公钥被成功分解的先例,所以低于1024位的公钥都被认为是不安全的。而C++自带的基本类型远远无法满足RSA的运算需求,所以RSA算法的实现必须依赖于高精度整型运算。本文旨在介绍RSA算法的实...

2017-06-21 22:30:58

阅读数 3792

评论数 3

OpenSSL在使用X25519时的小坑

OpenSSL从v1.1.0开始,就支持椭圆曲线密钥交换(ECDH)使用X25519曲线。但是示例程序并不适用于X25519曲线。

2017-06-13 19:36:56

阅读数 1820

评论数 0

一些简单的密码学常用套路

本文主要介绍一些加密库中加密算法的使用原则和需要注意的问题。 首要原则:如果工程中涉及任何安全加密相关的内容,**绝对绝对不要**尝试自己实现加密算法。 对称加密相关 当你不知道选什么加密算法时,用AES

2017-05-24 00:13:53

阅读数 7263

评论数 8

勒索病毒工作原理

前些天借着Windows上的”永恒之蓝“漏洞,本来几乎快销声匿迹的加密勒索病毒又重新回到了公众视线里。由于电信等网络运营商早就封堵了可能导致中毒的445端口,所以外网影响不大,但是教育网里的同学就遭殃了,尤其是很多临毕业的学生纷纷中招,论文被加密,可能因此被迫延毕。 本文尝试着还原这些勒索病毒中...

2017-05-22 13:48:12

阅读数 12712

评论数 2

STL实现细节之rotate()

STL中 rotate(first, middle, last) 函数的作用是原地把容器区间 [first, middle)(左半部分) 与 [middle, last) (右半部分)的元素互换。 它的实现充分利用了不同迭代器的特性进行算法优化,从而达到最优的性能

2017-04-26 19:45:37

阅读数 1573

评论数 0

STL细节之Tag Dispatching

引言在STL的设计中,对不同的容器(Container)进行某种处理往往使用的都是同一个函数,比如要将一个整型链表(std::list)或者数组里的元素划分成大于100和小于等于100两部分,直接调用std::partition()即可,非常方便。迭代器为了达到这样的效果,STL中所有容器都包含了...

2017-04-24 13:38:04

阅读数 734

评论数 1

关于斐波那契数列的一些总结

在程序员笔试面试中,经常碰到斐波那契数列计算的问题。网上已经有很多解释,本文打算进一步探讨其中可优化的空间

2017-04-22 16:44:44

阅读数 3305

评论数 1

RSA算法之原理篇

序言 RSA算法是最早得到广泛应用的公钥加密算法。它在通信加密、签名认证等领域都起着重要作用。 RSA算法最早由英国数学家Clifford Cocks在1973年发明,但由于当时被英国政府列为最高机密,直到死后不久其工作成果才被公布。而1977年,Ron Rivest、Adi Shamir 和...

2016-05-15 10:57:56

阅读数 6359

评论数 3

STL实现细节之addressof()

在C++11中,addressof(T& r)函数用于获得指向某个对象的地址(更早的STL通常也实现了该函数),也就是返回它的指针。通常来说,只要使用取址符&即可完成,为什么还要大费周章去设计这么个函数?

2015-03-11 01:27:21

阅读数 1022

评论数 1

米勒-拉宾素性检测算法

检验给定的一个整数是否为素数(素性检测)在公钥密码学中具有非常重要的意义。但我们发现要准确进行素性检测似乎有点困难(没有多项式时间的算法),所以我们稍作让步,使用一个随机化算法进行素性检测(事实上,要得到一个多项式时间内的素性检测算法,随机化是必要的)。这样一来,尽管做不到百分百准确,但却可以换来...

2014-09-30 19:59:03

阅读数 3987

评论数 1

扩展欧几里德算法与数论倒数

欧几里德算法是一个很古老但很有效的计算最大公约数的算法。这个算法很简单,用C++代码来表示就是: int gcd(int a, int b){ while(b != 0) { int c = a; a = b; b = c % b; }...

2014-09-30 19:29:51

阅读数 3547

评论数 1

Unix高级编程学习笔记——行缓存与全缓存

这是在学习Unix编程中进程部分的一个小问题。关于使用printf这样的标准I/O库函数时的缓存方式。 在输出到终端设备时,printf是以行缓存的方式写入的。而重定向到文件时,使用的是全缓存的方式。为了证明这一点,我们可以试验两段代码。

2014-09-29 23:35:01

阅读数 1162

评论数 0

RSA算法之实现篇(C++版)

序言 RSA中的密钥长度指的是公钥的长度,目前主流的公钥长度为1024、2048以及4096位。由于已经有768位公钥被成功分解的先例,所以低于1024位的公钥都被认为是不安全的。而C++自带的基本类型远远无法满足RSA的运算需求,所以RSA算法的实现必须依赖于高精度整型运算。 本文旨在介绍R...

2014-09-29 21:26:19

阅读数 12361

评论数 0

Windows下轻松配置openCV开发环境

openCV的调用与编译 openCV的调用与编译 openCV 环境配置 VS 计算机视觉 openCV是一个功能强大的开源计算机图形库,在计算机视觉领域有着广泛的应用。本文以openCV2.4.9为例,介绍Windows下openCV库的使用与编译。 o...

2014-08-14 21:26:22

阅读数 3062

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭