自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

那些零零散散的算法

放些算法相关的东西

  • 博客(19)
  • 收藏
  • 关注

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

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

2017-09-29 09:23:00 3666

原创 使用cuFFT实现大整数乘法

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

2017-08-23 17:53:59 2377

原创 谈谈有限域那些事儿

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

2017-08-17 23:12:31 17673 6

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

序言现代公钥加密系统中,常用的加密算法除了RSA还有离散对数加密和椭圆曲线加密。这两者原理比较相似,在这里一并介绍。离散对数问题我们在中学里学的对数问题是指, 给定正实数aaa和axaxa^x,求xxx。也就是计算x=logaaxx=loga⁡axx=\log_a{a^x}。这是实数域上的对数问题,不是什么难算的东西,随便按一下计算器结果就出来了。而离散对...

2017-08-03 11:35:05 21959 24

原创 红黑树原理简析

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

2017-07-15 17:21:36 1966 1

原创 数字签名原理及其应用

签名的作用无非就是证明某个文件上的内容确实是我写的/我认同的,别人不能冒充我的签名(不可伪造),我也不能否认上面的签名是我的(不可抵赖)。我们知道,手写签名之所以不能伪造,是因为每一个人的笔迹都是独一无二的,即使模仿,也可以通过专家鉴定分别出来。而不能抵赖,是因为每个人的笔迹都有固定特征,这些特征是很难摆脱的。正是这两点特性使得手写签名在日常生活中被广泛承认,比如签合同、借条等等。而数字签名

2017-06-25 15:40:34 54708 12

原创 RSA算法之实现篇(Python版)

RSA中的密钥长度指的是公钥的长度,目前主流的公钥长度为1024、2048以及4096位。由于已经有768位公钥被成功分解的先例,所以低于1024位的公钥都被认为是不安全的。而C++自带的基本类型远远无法满足RSA的运算需求,所以RSA算法的实现必须依赖于高精度整型运算。本文旨在介绍RSA算法的实现流程,不会对于涉及到的每一个算法进行深入介绍,如果需要进一步了解的可以参考本博客的其它相关文章。

2017-06-21 22:30:58 9749 3

原创 OpenSSL在使用X25519时的小坑

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

2017-06-13 19:36:56 7168 1

原创 勒索病毒工作原理

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

2017-05-22 13:48:12 27493 4

原创 STL实现细节之rotate()

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

2017-04-26 19:45:37 2616

原创 STL细节之Tag Dispatching

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

2017-04-24 13:38:04 1580 1

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

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

2017-04-22 16:44:44 10325 1

原创 RSA算法之原理篇

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

2016-05-15 10:57:56 8073 7

原创 STL实现细节之addressof()

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

2015-03-11 01:27:21 1442 1

原创 米勒-拉宾素性检测算法

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

2014-09-30 19:59:03 6016 1

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

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

2014-09-30 19:29:51 5176 1

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

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

2014-09-29 23:35:01 1342

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

序言RSA中的密钥长度指的是公钥的长度,目前主流的公钥长度为1024、2048以及4096位。由于已经有768位公钥被成功分解的先例,所以低于1024位的公钥都被认为是不安全的。而C++自带的基本类型远远无法满足RSA的运算需求,所以RSA算法的实现必须依赖于高精度整型运算。本文旨在介绍RSA算法的实现流程,不会对于涉及到的每一个算法进行深入介绍,如果需要进一步了解的可以参考本博客的...

2014-09-29 21:26:19 33870 2

原创 Windows下轻松配置openCV开发环境

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

2014-08-14 21:26:22 4389

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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