AES加密,Android, iOS, PHP三平台兼容互通

项目中遇到需要对某些敏感数据进行加密的需求,并且需要兼容Android,iOS,PHP三个平台,也就是说,各个平台上加密相同的数据,加密结果是一样,每个平台加密的密文,其他平台都能解密出正确的原文。

期初,看起来是一个很简单的需求,有强大的互联网嘛,Google下,什么都有,在经历了数次无果的尝试之后,才发现,这个问题并不是很简单,主要的原因是,每个平台实现的加解密算法都有一丝丝不同,要么是这个平台的密文,在另外一个平台不能正确解密;要么就是某两个平台的数据互通兼容了,第三个平台又不支持了;在经历了无数次的查阅资料,搜索stackoverflow后,终于搞定了这个问题,先上代码下载地址:

https://github.com/pkuoliver/EasyAES

先来了解下AES加密算法,来自维基百科

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES加密算法,有不同的实现方式,比如按照秘钥位数,分为128位,192位,256位;按照工作方式,有CBC,ECB,CFB,OFB等四种(详细内容可以查看这里);除此之外,为了数据对齐,还有不同的Padding填充方式,比如NoPadding,PKCS5Padding,PKCS7Padding,ISO10126Padding等填充方式。因此这样排列组合一下,各个平台的加解密不兼容就不奇怪了。

本文实现的是128位的CBC模式PKCS5Padding方式填充的AES算法,废话不多说,上代码:

Android/Java版的

而使用起来也很方便,直接传入要加密/解密的文字即可

Android/Java版本的核心代码就这样了,可以到https://github.com/pkuoliver/EasyAES下载代码。

iOS版和php版本的也都大同小异,加上PKCS5Padding的实现即可,需要注意的是,php基于mcrypt模块,因此要先安装mcrypt模块,然后在php.ini中启用。

需要源码的可以到本人的github中下载,如有错误,欢迎指正。

本文的参考资料如下,感谢这些无私奉献的人:

高级加密标准AES的工作模式(ECB、CBC、CFB、OFB)

AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

中国巨头互联网音乐公司总监谈产品设计

原标题:程序员漫谈产品设计

我是做技术的,对互联网产品一窍不通,更谈不上产品感觉,但这么多年和产品的配合,通过自己的观察,也没忍住对产品来一番纸上谈兵,产品经理不要指望能从中学到什么,因为会发现很多正确的废话,我无非是提供了一个程序员的观察视角而已。

假设产品为x,网络用户为u,产品的目标就是设计x,使得f(x,u)取得最大值,f可能是取日活,也可能是付费收入。x实际是无限维的,可能包括界面颜色,提示信息,免费下载数量,简化起见,可以以一维来思考这个问题。

产品的任务抽象之后,我们发现,所有的互联网产品(甚至任何产品),都可以抽象为一个寻找f(x,u)的最大值问题。问题的关键是我们不知道这个函数是什么形状,否则我们能够直接找到最大值,比如x:颜色为红色,允许免费下载6首,此时得到最大的f(x,u),比如日活100万。由于不知道这个函数的形状,找到这个函数的最大值便是困难的,无数的产品经理为此苦苦探索,所有产品的方法论都围绕这个核心问题。以下几种方法是常见的:

爬山法。

我们不知道f的形状,为了寻找最大值,我们根据直觉找到一个点x,然后通过反复迭代调整x,以期找到f的最大值。这种方法是目前最普遍的方法,即小步快跑,逐步得到产品版本x1、x2、x3….,这些产品能够让函数f的值逐步提升。这个时候产品的直觉非常重要,一开始找到一个合适的起始点x,离山峰太远,其次在迭代开发的过程中能找到合适的△x,以使得f(x+△x,u) > f(x,u)。

但这个办法有一个严重的问题,就是会陷入局部最优解,除非这个函数是严格的凹函数。如果很幸运,这个函数是严格凹函数,那么这个方法一定能找到最优解。很多公司的产品经常陷入局部最优解,或者已经接近全局最优解,梯度很小了。这个时候的产品经理很悲催,具体如何悲崔见各大互联网公司的加班情况。

模拟退火法

爬山法的缺点模拟退火法可以解决,这个方法在一开始尝试较大的△x,大步向前,然后慢慢的改成小步快跑。这个方法的的优点是在一开始△x较大,有较大的概率找到一个较高的山峰来爬,然后在此山峰的山腰上往上爬。

该方法能大概率设计出最好的产品,但是缺点也很明显。那就是较大的△x俗称大改版需要付出成本和承担风险,没有谁知道你这次大改版是跳到了一个更高的山峰上还是跳到了一个更矮的山峰的山腰上,大改版失败的例子随便搜,比如vista。

遗传算法

大规模集团军作战方法,适用于只许成功不许失败,不计成本的产品。这个方法一开始就选择多个不同的产品原型开始x1、x2、x3,然后这些产品做交叉遗传和变异,经过很多一代的演化,最终得到最优的x。这个方法的优点是基本能找到最优解,缺点是成本高。以微信为例,就是多个团队同时开发,最终广州团队胜出。

智能方法

这是个人的幻想,不要当真。上面的三种方法都建立在函数f的形状不知道的条件下,假如我们有某种方法能提前知道函数f的形状,那么我们当然是又快又最优的设计出了产品。这种方法有没有,其实有的,但只是对个别维度有用,比如根据以往的收费情况,我们通过模型预测出定价为50元的情况下,付费是最优的。这个时候我们就不需要去不停的尝试不同的定价:20、80、45、60、48、55、50。

现实情况往往更为复杂,很多问题没有深入探讨,这里没有考虑市场、品牌、竞争对手等因素,尤其是没有考虑时间因素。尤其是时间,在不同的时间f(x,u)的形状是不同的。比如在2006年,瑞星如果启动免费策略,此时函数梯度很大,也许f(x,u)函数能取到很大,但2011年,再启动免费,已经于事无补,因为函数的形状早就变了,用户反应波澜不惊。

另外一个常见的问题就是选择了错误的函数f,比如选择日活,最后发现日活都是僵尸日活,带不来收入。在基层执行的产品经理还面临一个实际的问题,不同的领导告诉他们不同的函数,或者同一领导不同时候取不同的产品经理苦不堪言。

总之,程序员就像是一个爬行在函数曲线上的虫,产品经理就是骑在虫背上指挥的盲人,骑手的感觉决定了这次冒险的结局。以上拙见,供人一笑,抛砖引玉,共同探讨。

作者:Dr.Liu

微软感受 – 王垠

原文:http://www.yinwang.org/blog-cn/2016/09/10/microsoft2

在微软两个月了,也可以说一说自己的感受了。

先说说好的地方吧。在微软,我终于可以不用碰 Go 语言,REST API 之类的垃圾。C# 确实是一个挺不错的语言,虽然我发现一两个需要改进的地方。在微软,我没有遇到过特别自大的人。有些人心里也许还是很自我,但不像 Google 之类公司的人,有那么张扬的表现。微软不提供免费的午餐,而是要求员工付出少许的费用(6块钱以下),这提高了食物的质量,而且避免了浪费。在微软的饭桌上,人们谈论的不是某些牛人有多厉害,要怎么发财,而是谈论生活,音乐,电影,食物…… 这些都是我很欣赏的地方,每一个成熟的公司都应该拥有这样的特征。

继续阅读

一个程序员眼中的价值(转载)

看了鸟哥(php社区唯一一位亚洲核心开发者)的一篇博文,很赞同其中的观点,转载如下:

前天看了TimYang的<一个技术从业人员眼中的2014> , 有些观点我很是赞同, 于是我也有了想写点什么的冲动…

在2015年的第二天, 我终于好像有了一些跳跃的想法, 可以说给大家听听. 也许不够体系, 不够完整, 但或许能得到一些共鸣.

我先给我大家讲讲我的故事, 我在2007年的时候去了雅虎实习. 当时应聘实习的时候, 我记得我和面试官应该表达过, 我不在乎赚多钱(实习生工资), 只是希望学习.

后来, 2008年的时候要毕业了, 因为在雅虎的氛围等让我觉得非常好, 我几乎没有看什么其他机会就签了雅虎中国, 当时的工资是7000一个月..

就这样相安无事的过了2个月, 突然第三个月要补交社保什么的, 一个月的工资发到手只有不到1000多块(也许我记得不是很精确, 不过只记得很少).. 继续阅读

本博又一次“起死回生”

从本博第一次开放到现在,已经死了三四次了。

主机从香港搬到美国,又从美国到国内的一个“黑机”,接着又辗转到新浪在香港的SAE,到忘记续费所有的数据被无情的删除,到现在的阿里云,6年过去了。庆幸的是,现在,它,重生了!!!

这六年里,域名从redfox66.com到diducoder.com,博客程序从blogengine.net到wordpress,服务器系统从windows server到centos,好像一直在逃难,庆幸的是,现在,它,重生了!!! 继续阅读

海量数据处理专题(九)——外排序

【引言】

在数据结构的课程上,我们学习了不少的排序算法,冒泡,堆,快排,归并等。但是这些排序方法有着共同的特点,那就是所有的操作都是在内存中完成的,算法过程中不需要IO,这就使得这样的算法总体上速度比较快,但是也随之出现了一个问题:当需要排序的数据量异常的大的时候,以上的算法就显得力不从心了。这时候,你需要一种另外的排序算法,它的名字叫“外排序”。

通常的,设备的内存读取速度要比外存读取速度快得多(RAM的访问速度大约是磁盘的25万倍),但是内存的容量却要比外存小很多,当所有的数据不能在内存中完全放下的时候,就需要使用到外排序。这是外排序的一个显著特征。 继续阅读

CSDN-中文IT社区-600万.rar-CSDN杯程序员最爱的mm评选

CSDN这次丢人丢大了,蒋涛同学现在估计正焦头烂额。
事件始末:

昨天有人将CSDN的2009年4月份以前的用户名和密码发布到了ed2k:网络上了,CSDN-中文IT社区-600万.rar。由于CSDN是采用明文存储,导致600万用户密码集体泄露。

这里有第三方查询密码是否泄露的网站:http://0bad.com/csdn.php 如果您的密码也在泄露之列,请尽快修改,以及其他网站的密码。

该事件出现以后,各路神仙大显身手:

据说现在推上在举行CSDN杯我最喜爱的CSDN密码活动,我觉得与其评选人们最喜爱的密码,还不如评选密码里面最受喜爱的人。那么谁得到的爱最多呢,我统计了一下包含ilove***的密码,其中被爱得死去活来的前100位如下: 继续阅读

组合数学之把妹要诀

王络丹住址问题公交卡丢失问题之后又一有意思的讨论。

离散数学课(CSCI 2110)上,讲到一个有趣的问题。

假设有五个男生,五个女生,每个人都在自己心中对五个异性有一定的preference排序,比如:

以上的排序表解读为:男生1最中意女生C,次中意女生B,次次中意女生E。。。。 以此类推。。。。 继续阅读

我是如何推理出王珞丹住址的

前言

不错,我确实知道王珞丹(《杜拉拉升职记》的女主角)的住址,只可惜是前住址,因为她最近搬家了。我分析出她住址是在一年前,那时候她还住在那里。前段时间有人问我是如何推理出王珞丹住址的,我没有说,一来是因为为了尊重别人的隐私,二来我也不是狗仔队。

今天碰巧骑车路过那里,看到大大的窗玻璃上贴着招租的广告,便知道她已搬家。既然搬家了,那么我把去年分析推理出她住址的过程说出来便也无妨。 继续阅读

公交卡丢失之后-数学牛人教你如何建模找到丢失的手机

当你的手机钱包丢失了之后,你会怎么办?“丢了就丢了”可能是是大多数人的做法。这里告诉你一个牛人的做法,如何利用组合数学建立模型,从而成功找到拣手机的人。

5月底,我的卡丢了,同时丢的还有一部手机,上面有不少人的电话,我跟拣到手机的人约定,把手机给我,我给他500元钱,可是等我第二天再打电话的时候,手机就无消息了!幸好,包里面有我一张公交卡,我想能通过一卡通网站把他找到。

果不其然,他居然使用我的公交卡了,因为我留有公交卡的存根,于是就在一卡通的网站上寻找答案。6月1日他走的路线非常诡异,石佛营西里—-前门—–木犀园—–前门—–动物园——北师大——望京,晚上是望京657—–朝阳公园桥—-石佛营西里,非常奇怪的路线,我先前以为他是专业扒手,但是仔细看不像,因为那人白天不乘车,所以应该不是扒手。我还在670里面贴了帖子,可惜现在帖子没有了。 继续阅读