1. php的aes算法,加密时会存在空格,0,\0等方式进行补长,所以解密后需要进行trim操滚宏作,才能得到原数据串
2. aes加密后进行base64_encode,但是解密时,直接用aes进行解密,不需要先base64_decode.【这个操作很骚气】
function _decryptData($data,$password, $iv){
$decryptData=openssl_decrypt($data, 'aes-128-cbc', $password, OPENSSL_ZERO_PADDING, $iv);
$data =json_decode(trim($decryptData), true);
return $data;
}
function encryptData($data, $password, $iv){
$data = json_encode($data);//$data是枣备逗一个数组,如果是字符串,请凳卖忽略此句.
$result = base64_encode(openssl_encrypt($data, 'aes-128-cbc', $password, OPENSSL_RAW_DATA, $iv));
return $result;
}
② 哪些国内人力资源外包公司比较靠谱
靠不靠谱这个念碧小唐不好说,但是能给你几点选择外包公司的建议:
1、公司成立时间:时间越长肯定经验也比较丰富。
2、行业经验是否切合你或你公司的诉求
3、员工关注度:这点对于求职者和项目合作者同样重要,尤其是对于项目合作方来说,这点一定不能忽视,如果外包公司对员工关注不及时,那么员工稳定性一定会有问题。
4、售后服务质量:这点被很多人忽略,因为不是人员进场就万事大吉了,人员完成项目结束退场才是成功结束,所以外包公司的售后服务态度是很重要的。
5、交付人员技术水平:我们专注IT人才驻场领域长达8年多的时间,历模自有80w+ 人才库,服务涵盖每一个主流IT行业技能,包括:java、web前端、.NET、android、IOS、PHP、C#、运维、UI、软件测试等。对于人才的筛选我们有着自己的专业流程体系。根据用户对于人员的要求,输送到客户方的简历我们会先进行三轮简历筛选。其次再由我们的技术总监进行一轮初步面试,接着把通过的人才简历输出给客户,由客户确认面试,通过面试,最后仔烂举安排人员到岗进行驻场服务。
③ 怎么制作一个APP制作安卓和iOS的APP区别是什么
遵循这些步骤,你的 App 就能同时在 iOS 和 Android 保持完美!
1. 总体的样式
从 iOS7 以后,Apple 就一直在采用扁平化的设计模式,去除了所有不必要的纹理和阴影等效果——和早些年间的版本完全不同。Google 的新 MD 设计规范有了一些更加细节的规定,通过一种叫“纸片”的方法来创造更多的层级关系。
2. 实体按钮
Android 有一个返回按钮,点选它可以返回上一个萤幕。
iPhone 上则没有这样一个按钮,所以需要有一种方式能够让使用者回到先前的萤幕。通常的解决方案是在萤幕的左上角放置一个返回键。
3. 通用元素
两种平台之间的确存在着一些通用的元素,比如说状态列和标题栏,它们会出现在每一屏的顶部。你不应当改变导航栏慧念的高度,如果你想让 App 看起来更加原生的话。所以,我推荐你在设计的第一页就定义好标题栏的样式,然后在其他的萤幕上使用一个占位的方框来替代,这样能省下不少时间,但是你应当向程式设计师说明标题栏在不同的萤幕上都是一样的样式。
不同平台上的导航栏有一定的差别。在 Android 上文字是左对齐的,然而前如困 iOS 上是居中对齐的。在 iOS 上,很多企业都用它们的 logo 来替换首页标题栏中的文字,但是在 Android 装置上这不是一个好的主意。状态列(显示你的网路、电量和时间资讯)是系统元件,你不需要考虑设计它,只要确保它们不会对他人造成误解就好了。
4. 导航
或许iOS 和 Android 平台之间最大的区别就在于他们的导航样式了。Android 上最主要的导航方式是抽屉选单,Android 使用者们通常在这个选单内进行跳转。而且在整个 App 中,这种体验是一贯的。Apple 的导航样式更倾向于 tab bar,它位于萤幕的底部,并且以一种很简单的方式实现上部内容的切换。当你设计 App 的结构的时候,你可以为不同的平台设计不同的导航样式。
5. 要不要用卡片式
在 UI 设计中,卡片正逐渐成为一种主要的 UI 设计样式,它们可以应付多种情况,而且给使用者提供了一种能够呈现有效内容的便捷方式。视觉上,卡片非常适应于 Android 的 Material Design(它事实上源自于纸张的灵感)。使用阴影和卡片之间的合理间距能够建立一种自然的外观。
在 iOS 上,使用卡片设计需要更加的小心谨慎,尽管一些大型的 App,诸如 Facebook 和 pinterest 的确使用了一种略微偏离 iOS 视觉规范的设计风格。Instagram 使用了一种完全扁平化的设计风格,尽管从结构的观点上看,使用者的每一条推送都能被视为是一张卡片,instagram 的设计很值得你去花时间揣摩,它是如何遵循 iOS 视觉规范的。如果你要在 iOS 平台上应用阴影,你最好小心谨慎,尽量使得这些阴影不是那么的明显。
6. 排版
iOS 系统上的预设字型是 Helvetica Neue,在 Android 上则是 Roboto。尽管这两种字型在外观上有显着的差异,但是这两个字型的尺寸却是近乎相同的。如果你想要在设计的时候节省时间,那么用一款字型就可以,但是要和开发人员沟通在不同的平台上使用对应的字型。而在设计重要的布局结构和使用大号字型时,我建议你还是同时用这两种字型测试效果。
如果你想要精益求精,那么你就要对不同平台上的设计规范更加注意。比如如下几条:
Android 的 MD 设计需要用到更多的空格来进行布局
在 MD 中字号的变化会更加多样
在 iOS 上,字型没那么多大小差异,但是在字型重量上(Font weight)有更多的变化,同样允许你建立主次结构
两个平台都使用比较细的字型来现实正文内容,然而,在下面的例子中,Android 使用了轻(Lighr)和常规橡肆(Regular)字型,而 iOS 使用了粗体(Bold)和常规字型
这是一个非常简单的例子,向你展示了排版方面的一些细微的不同可以导致印象上的巨大差异——你能很快分辨你是在用 Android 手机还是在用 iPhone!
7. 网格和触控元件
iOS(@1x 下 44px)和 Android(1:1 比率下 48p)都有对可触控元件的设计规范。MD 规范同样建议对所有元素使用 8dp 网格对齐。
在最近的专案上,我发现遵守 Android 的这些设计规范会更加安全,因为大一些的 48px 的按钮在两个平台上都表现良好,而且 MD 的规范更加全面,还经常更新。不管怎么说,你都应该在设计中使用网格,但是我们发现定义更加明确的 Android 网格会更好用一些。
h
如果带红外的安卓手机,可以再树莓派加一个红外接收器
普通手机可以往服务器把指令传送到资料库,树莓派通过无线网络卡轮询资料库,最好做一个服务端,树莓派通过访问接口获取指令
楼主可以用app制作平台呀!免费app制作平台很多,像国外的有Appmachine,国内的应用之星,我都用过。感觉应用之星更适合国人,操作很方便,不用懂任何程式设计技术,一看就会,而且应用之星还免费,不像其他的制作平台要年费什么的。楼主有不懂的地方可以继续追问我哈~
做什么软体?
浙江天尔软体技术有限公司,可以看头像联络 ,在十几年的开发经验中总结出了开发一款APP的注意事项,你可以参考下:
开发一个完整app需要掌握哪些知识
1、前期需求规划与资讯——你需要制定出一个完整的需求文件,功能文件,流程图,时序图。
2、互动设计、UI设计——设计出基本且完善的原型图和app基础的互动设计效果,之后再根据这些设计出完整的UI接口并学会切图,一些需要做自适应的素材图片需要做点9patch。 这里还需要你懂得px,pt和dp之间的换算,萤幕密度的换算和相互之间的系数,以便你的app能完美适应不同分辨率装置。其中互动设计需要你懂得很多人机操作的技巧经验,掌握Axure等互动工具的使用,UI设计需要你掌握Photoshop和Illustrator等操作。
3、使用ADT之类的开发环境进行app软体开发,你最基本的也得掌握java语言,熟悉android环境和机制。
4、如果不是单机版的app,需要用到服务器,那你还得掌握WebService相关知识和开发语
言,常用的有ASP.Net,PHP,JSP等。
5、熟悉并能开发资料库。
6、某些功能需要做算法,这还需要一定得专业知识,尤其是数学基础。
7、熟悉API接口开发,这里包括你自行开发API的能力以及呼叫第三方API的经验。
8、熟悉TCP/IP,socket等网路协议和相关知识。
9、熟练掌握App释出的流程,真机除错技巧,证书,打包,上架。 App开发其实不一定适合一个人搞,太费劲,除非是一个单机版的小应用,或者利用现成的app开发简单的第三方应用,否则还是让一个团队来完成各自擅长的领域。
只有h5可以实现你所说的那种
做App是很复杂的,需要一个团队来完成,就是:找技术、找设计、找钱(大概百万左右)。
不过如果不想这么麻烦,可以选择一些开发公司,只要一步,找钱(百万左右),就够了。
当然,如果不想那么麻烦,还不想花那么多钱,可以试试类似小云app这样的线上开发平台,里面有各个型别app的模板,选择一个直接生成就可以了,也分三步:选个模板、起个名字、一键生成。基础版的app几分钟就可以生成,如果想增加功能,可以再在平台上购买,大概两千块钱左右。
你好!
如果想学程式设计,就去学校,,貌似你也不会为个APP去学枯燥的程式设计吧。有APP制作公司,专门定制各种APP,根据技术难度要求价格好谈。要看什么级别的APP了,现在APP软体那么丰富也没那必要吧。除非你是做广告营销等,想赚钱的
分为商家端和使用者端,业主这块可以释出自己的资讯和价位,使用者通过下载后可以检视具体房屋资讯,提高使用者的使用率和占有率,更多可看华鑫通网路科技
④ 想开发一款安卓社交类的APP需要有哪些准备
一个人开发一个安卓社交APP不难,如果是业余时间,每天下班回家到12点,这样每天大概4个小时,外加周末每天12个小时,一个月足够了(有经验的条件下)~
A.UI设计是否已有?如果有会节约很多时间,没有你估计还得自己PS一下图片;
B.对编程是否有经验?从题主的问题可以看到你对编程估计经验不足;
社交软件分很多种,常用的无非附近人,发发图,拍拍照,修修图,拍拍视频;
⑤ iOS想PHP服务端传数据,怎么加密好
客户端
每一个请求的URL中加上时间的参数。对url中的参数是排序好的。
然后对这个URL进行MD5。将这个MD5作为最后一个参数(sign)拼接到url最后。
服务端
收到请求后,对去掉最后一个参数的url进行md5。得到的md5和参数中的md5进行匹配。如果匹配成功进行正常返回,如果不成功就500
加密
用AES的。
⑥ PHP判断手机是IOS还是Android
用HTTP_USER_AGENT来实现即可
判断代码如下:
⑦ 达内课程都有哪些
【达内教育】包含的课程有以下这些:
Java企业级应用软件工程师、Java互联网架构软件工程师、Java大数据工程师、Web前端开发工程师等一些课程,课程围绕8大核心模块展开,了解企业的用人需求,并制定个人发展规划,进而掌握高效能职场人士必备的技能。学员入学先选择自己意向的课程方向,签订企业offer,最后跟着老师完成岗前技术培训,培训结束入职企业。培养的学员专业技能强,职业素养好,在用人单位中拥有良好口碑。培养学员严谨的工作态度、信息化思维以及快迅独立解决问题的能力,可以在岗位上更加能发挥能力,应付工作上遇到的难题。感兴趣的话点击此处,免费学习一下
想了解更多有关达内课程的相关信息,推荐咨询【达内教育】。【达内教育】重磅推出“因材施教、分级培优”创新教学模式,同一课程方向,面向不同受众群体,提供就业、培优、才高三个级别教学课程,达内“因材施教、分级培优“差异化教学模式,让每一位来达内学习的学员都能找到适合自己的课程。达内IT培训机构,试听名额限时抢购。
⑧ 软件开发行业怎么样
问题一:软件开发这个行业发展前景怎么样? 我感觉 软件开发是不错,
每一个阶段开发重点不一样。
现在比较流程Java与php,android和IOS的开发。
问题二:软件开发行业未来前景怎么样? 第一点:人才短缺
有很多人在大学时期争先恐后地报名有关计算机的专业,这些学生中有的是受父母之命,看中的是将来毕业后可以在社会中扎稳脚跟,有的是秉着对这个专业的向往和热情才报名的。前者那样的学生进入这个专业学习往往带着功利性的目的,所以很难把软件开发学精,而后者往往更能出现人才和精英,但是后者在现在看来应该是社会上所缺乏的。
第二点: *** 的支持
随着全球经济一体化不断地发展,我国的软件市场也在不断地蓬勃发展,但是我们的软件行业还是比其他几个大国起步晚,而且规模也不是很大。但是,我们 *** 十分支持软件开发行业的发展,使得它系统化和体系化的发展,因此,软件产业高速发展起来, *** 的支持是软件开发的就业前景怎么样中很重要的一点。
第三点:社会需求增加
由于软件开发这个行业中的人才资源短缺,移动互联网的发展,所以很多企业愿意花更高的价钱去寻找这样的人才,而且,越来越多的人对手机简直爱不释手,手机里的软件也需要很多具有专业知识的人才来开发,这里的软件开发将不仅限制于电脑软件的开发,由此看来,软件开发这个行业在将来会多么吃香了。
问题三:软件开发这个行业前途怎么样? 20年前我去一家客户那做实施的时候,有个客户愤愤地说:“你别看现在搞软件的火,不出五年就得臭大街”。当时我就呵呵了。软件开发在这几十年都应该是长盛不衰,只要计算机技术不断向前发展,软件开发行业就一直不断需要人才。而且现在计算机领域不断扩展,需要的开发人员也不断增加。相对的前沿的技术也非常值钱,谷歌的无人驾驶汽车工程师好多都辞职了,原因是工资太高,已经赚够了,不想在工作了:0
问题四:做软件开发这个行业好吗 软件开发现在很多人在做了..个含金量也就不高.开发是要记代码..很累的..整个脑要运转要很快..软件开发吃的是青春饭..也就说如果你做开发..做到三十几岁还没做到管理层.就会被新的员工赶上.你想想,一个年物局纪大的人和一个年轻的员工这两者是不一样的.年轻的人意气风发.他们的脑子的思维也就肯定比30 40的人要强.思维活跃..
现在正当最好的职业是做测试工程师了,不信你可以上网搜一下,没有人说不好的..工资超高.地位高.认识的朋友圈对以后将来发展是很大帮助的
因为我是做测试的,我肯定罩睁让知道,我也是从开发转到做测试的,工资也就8000,还算过得去
问题五:软件开发行业前景怎么样 二0年前我去一家客户那做实施的时候,有个客户愤愤地说:“你别看现在搞软件的火,不出五年就得臭大街”。当时我就呵呵了。软件开发在这几十年都应该是长盛不衰,只要计算机技术不断向前发展,软件开发行业就一直不断需要人才。而且现在计算机领域不断扩展,需要的开发人员也不断增加。相对的前沿的技术也非常值钱,谷歌的无人驾驶汽车工程师好多都辞职了,原因是工资太高,已经赚够了,不想在工作了:
问题六:软件开发这一行业怎么样?工资高吗? 10分 以PHP为例子
PHP在全球发展非常迅速,越来越多的编程人员选择PHP开发,也越来越多人开始早乱参与PHP培训。PHP程序员工资根据工作经验、个人能力、工作地区等多方面因素,初期的话,工资范围一般在5000到10000之间。
学习PHP优势:
1、门槛低
在C/C++、Java(Java教程Java培训 )、PHP、ASP(ASP培训 )这些开发语言中,PHP是最容易学的语言,学习成本是C和JAVA的1/10,是ASP的1/2。
2、竞争少
PHP发展迅速,大学里基本未开设PHP课程,有实力的培训机构很少,导致掌握PHP的程序员非常少。从求职的角度来看,PHP招聘信息和JAVA或ASP比较,PHP招聘量达到JAVA和ASP的1/3,但是PHP应聘人员只是JAVA和ASP的1/40。
3、需求旺
网络、新浪、搜狐、淘宝、当当、腾讯QQ等大部分的互联网(IT培训 计算机培训 电脑培训 )相关企业都在使用PHP,对PHP人才需求旺盛。但是互联网企业最头疼的问题就是招收不到有实际PHP学习经验的人员,更别说接受过PHP专业培训的人员了。
4、发展空间大
在无孔不入的互联网应用环境下,Web2.0、云计算(云计算 云计算培训 云计算概念 云计算技术 云计算服务 )、物联网等新概念将不断催生出新的产业和服务。而支撑这些新型产业和服务的技术体系非PHP莫属。而随着3G和移动互联网技术的兴起,越来越多的WEB应用也选择了PHP作为主流的技术方案。(更多IT相关阅读推荐:2017哪个专业就业前景好)
PHP特点:
1. 基于Web量身定制
2. LAMP架构安全稳定
3. 简单快速,扩展性强
4. 企业级应用发展迅速
从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务。同时,作为针对Web开发量身定制的脚本语言,PHP一直秉承简单、开源的思想,这也使得PHP得以快速的发展,并且大力地推动Web2.0的出现与发展。但是,长期以来,PHPer被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出,也导致很多人觉得PHP程序员工资不会高。
PHP程序员工资差别那么大也很正常,有丰富经验的人到了公司直接就可以工作了,效率自然是非常高的,如果是一个刚入行的PHP程序员,能保证不出问题就很好了,更不要提速度了。既然学了PHP开发就不要担心有没有前途的问题,想办法提高自己的PHP编程能力才是最重要的,因为任何领域站在制高点的那些人都是各大企业争抢的目标。
问题七:软件开发行业前景好不好? 混得好,前途钱景当然是不错的 做软件也是挺累的 关键看你是否适合这行业,不要看行业是否有前途
问题八:软件开发行业真的好吗?现在学习软件开发怎么样? 你想学来干什么呢?
当兴趣的话,非常好,益智健脑,其乐无穷。
当职业的话,现在已经不像前几年了,那时几乎所有一类大学的软件相关专业毕业生就业率都非常高,待遇普遍也都不错,现在学的人越来越多,很多人都是培训班培训个半年到一年就来上岗了,大大降低了这个行业的入门门槛,对于新人来说,待遇也就不如以前了。如果你想干这一行,就得学的精通,否则工资待遇和其他行业的普通员工没有什么区别。
问题九:IT行业前景怎样?学软件开发需要具备什么呢? 信息产业前景依然乐观。学习软件开发之前首先要对计算机原理及硬件组成十分熟悉。提前预热和储备基础知识,建议先仔细看过这些书:计算机组成原理、编译原理、离散数学、Java语言(C++也行,主要是学习C语言的编程思想)、VS、算法与编程等。这些也是我们计算机软件工程专业的核心课程。在我们这些书当中都有一些编程实例及源代码,你自己在看的同时也拿记事本把它们写出来进行编译运行一下,体会一下编写你自己的软件程序的成就感。这样就可以增强你的兴趣,从而慢慢成为一个程序员。(我是过来人,刚开始我把书里的代码进行改造,后来学会了技巧之后,开始写自己的小程序软件,久而久之就成为了一名程序员。)不过很费眼睛,还需要耐心。千行代码,不可以错一个,否则编译就会出错,需要相当的细心才可以!希望你能成为我们的一员!
问题十:软件开发工作怎么样 吃年轻饭,工资高,工作强度大,经常加班,熬夜。
个人的一点建议:就把我这7年的工作经验很高兴能和你分享下让你少走弯路
先可以到网上找下你那个工作的前景,有的行业还是不错的
不管做什么行业,只要努力去做好了基本都有回报的
没找到工作之前花销很大,如果是现在准备出去找工作的话,要提前准备
尽量到熟人和亲朋好友多的城市的工作,累了,可以找亲朋好友聊聊心
现在国内的经济不是很景气的,都是在转型的是很,可以关注下央视经济频道
由于有时候别人觉得你的学历偏低,经验不足的原因,把我几年的工作经验和你分享下吧!!!
1、工作地点上尽量避开市区,市区内的岗位竞争较激烈
2、选择制造型企业,制造型企业对学历的要求不会太苛刻
3、选择中小型企业,大型企业对学历要求高且严格
4、学习再学习,无论在职与否,要多看与工作相关的书籍,充实自己。
5、找工作的过程,其实也是学习的过程,可检讨自己的不足之处,予以及时弥补。
6、人人都是人才,相信自己,找工作要有耐心。
7、同时中小型企业可以给予你更多实践锻炼的机会。
第一:找工作如何防骗
1、去当地正规的人才市场,不要相信所谓的那些路边的信息
2、在正规的网上投简历,更不要相信一些公司招牌不清楚的信息
3、如果收到对方面试要求,你先大概的分析下对方的公司情况
4、要登录网上提前了解公司详情,并确定好自己想要的地方
5、路边的招工信息不要信,有的都是把你带到人少的地方敲诈
第二:对方打电话过来分析综合因素
1、对比――根据招聘启示要求,列出自己的情况进行分类:符合、基本符合、不符合。
2、分析――对你准备应聘的单位状况、行业形势、竞争等情况进行分析研究,了解有关信息。
3、简历――个人简历除了大众的要求外,如能因人而异、别出心裁地简历设计会有很好的效果
4、比如――善于搞创作的来一本“书本”简历(将自己的文章收集在一起)
5、稿单――(发表作品的稿费单复印件)简历
6、作品――简历(把自己的饿作品带上“视频”)(把个人情况、工作业绩等形式记录下来)。
第三:应聘时候的自我介绍
1、推荐――准备好在最短的时间内,用最简单、恰当的语言来介绍自己。
2、自信――不要问“招几个”,要相信自己才是唯一适合的人选,但不要盲目自大。
3、仪表――个人的仪表要根据应聘的职位来做出相应的“包装”,也可给自己带来信心。
4、记录――准备笔和纸,写上面试地点的位置、路线及负责人,自己简介,观点等。
5、准备――准备好面试时常见的问题的对策,如为什么要离开原来的职位,你有哪些优缺点
6、认为――自己最为突出的成绩是什么,你的工作目标是什么
7、以前――公司的老板、管理人员、员工有什么看法
8、公司――了解多少,有什么要求,希望得到哪个职位
9、对该――职位的设想,以及薪资要求等。
第四:应聘面试的如何能做到礼节性
1、守时――在预约的时间提前到达,做一些应聘前的再准备。
2、面试――起立握手,力量适度;微笑轻松,直视考官
3、对话――交流,权当享受;提问倾听,跟上思路,
4、回答――问题,灵活真诚;结束之时,莫忘感谢;取得名片,加强联系。
5、焦点――尽力在有效的时间内,把握交流的焦点:职位要点。
6、感受――面试之后,不管结果如何,都要把自己的感受记下来,一次经历,一次提升。
7、禁忌――不自信,不严肃,不诚实,找熟人,重待遇,乱发问。
第五:该谨慎的东西需要注意下
1、如果对方公司是小公司,没有几个人,让你交押金啊,服装费啊之类的一律不交
2、你还没挣到钱呢,倒先给他交钱肯定是骗子,去面试的时候......>>
⑨ android ios php 哪个好 知乎
php和ios还有安卓在同级别的情况下,ios的工资目前来看是稍微高点点,ios需要了解学下c语言,安卓则需要学java,你说看了ios觉得很难,那也不建议看安卓,建议你学php,容易上手快,去培训做几个项目基本就可以了,快速找份工作没问题,刚开始工资六七千应该问题(就深圳而言)不大只要学得还可以,JavaScript要精通学好可不容易,学php得时候必学JavaScript。至于前端,你学这三种语言都会学前端,语言是相通的,如果你学了php再去学ios和安卓应该会好些,程序猿不应该只懂一种语言这样在未来不保险。不建议题主边上班自学,这样效果不怎么好,你没有任何经验,一个人捣鼓说实话累,编程最好能找几个人一起做,至少出现bug的时候实在弄不好的时候有人能询问,有时候改bug真的很费时间,说多了都是泪.............
有人说数学和英语不重要这句话真的是超级坑爹,如果题主培训完了找份工作求温饱确实是没问题,但随着时间的推移如果需要往上走,那一定会用到数学,很多编程的思维方式数学中都有提到过,英语可以不一定要好,但题主要往上爬就需要数学了,如果题主高中大学数学都好那学起来会轻松许多,当然英文好的话那知识面可以更广........,像汇编和c还有编译原理,数据结构等等,这些杂七杂八的都要涉猎,这是往高手之路需要学习的,你可以看看大学计算机软件课程的课表。
⑩ Android在用AES加密字符串之后再用base64加密,加密的结果跟ios端不一样,
之前在项目上用到AES256加密解密算法,刚开始在java端加密解密都没有问题,在iOS端加密解密也没有问题。但是奇怪的是在java端加密后的文件在iOS端无法正确解密打开,然后简单测试了一下,发现在java端和iOS端采用相同明文,相同密钥加密后的密文不一样!上网查了资料后发现iOS中AES加密算法采用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。我们知道加密算法由算法+模式+填充组成,所以这两者不同的填充算法导致相同明文相同密钥加密后出现密文不一致的情况。那么我们需要在java中用PKCS7Padding来填充,这样就可以和iOS端填充算法一致了。
要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现,下面我会提供该包的下载。啰嗦了一大堆,下面是一个简单的测试,上代码!
001 package com.encrypt.file;
002
003
004 import java.io.UnsupportedEncodingException;
005 importjava.security.Key;
006 import java.security.Security;
007
008 importjavax.crypto.Cipher;
009 importjavax.crypto.SecretKey;
010 importjavax.crypto.spec.SecretKeySpec;
011
012 public classAES256Encryption{
013
014 /**
015 * 密钥算法
016 * java6支持56位密钥,bouncycastle支持64位
017 * */
018 public static finalString KEY_ALGORITHM="AES";
019
020 /**
021 * 加密/解密算法/工作模式/填充方式
022 *
023 * JAVA6 支持PKCS5PADDING填充方式
024 * Bouncy castle支持PKCS7Padding填充方式
025 * */
026 public static finalString CIPHER_ALGORITHM="AES/ECB/PKCS7Padding";
027
028 /**
029 *
030 * 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥
031 * @return byte[] 二进制密钥
032 * */
033 public static byte[] initkey() throwsException{
034
035 // //实例化密钥生成器
036 // Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
037 // KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM, "BC");
038 // //初始化密钥生成器,AES要求密钥长度为128位、192位、256位
039 //// kg.init(256);
040 // kg.init(128);
041 // //生成密钥
042 // SecretKey secretKey=kg.generateKey();
043 // //获取二进制密钥编码形式
044 // return secretKey.getEncoded();
045 //为了便于测试,这里我把key写死了,如果大家需要自动生成,可用上面注释掉的代码
046 return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c,
047 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07, 0x0a, 0x04, 0x0f,
048 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09,
049 0x06, 0x07, 0x09, 0x0d };
050 }
051
052 /**
053 * 转换密钥
054 * @param key 二进制密钥
055 * @return Key 密钥
056 * */
057 public static Key toKey(byte[] key) throwsException{
058 //实例化DES密钥
059 //生成密钥
060 SecretKey secretKey=newSecretKeySpec(key,KEY_ALGORITHM);
061 returnsecretKey;
062 }
063
064 /**
065 * 加密数据
066 * @param data 待加密数据
067 * @param key 密钥
068 * @return byte[] 加密后的数据
069 * */
070 public static byte[] encrypt(byte[] data,byte[] key) throwsException{
071 //还原密钥
072 Key k=toKey(key);
073 /**
074 * 实例化
075 * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现
076 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
077 */
078 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
079 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM, "BC");
080 //初始化,设置为加密模式
081 cipher.init(Cipher.ENCRYPT_MODE, k);
082 //执行操作
083 returncipher.doFinal(data);
084 }
085 /**
086 * 解密数据
087 * @param data 待解密数据
088 * @param key 密钥
089 * @return byte[] 解密后的数据
090 * */
091 public static byte[] decrypt(byte[] data,byte[] key) throwsException{
092 //欢迎密钥
093 Key k =toKey(key);
094 /**
095 * 实例化
096 * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现
097 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
098 */
099 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
100 //初始化,设置为解密模式
101 cipher.init(Cipher.DECRYPT_MODE, k);
102 //执行操作
103 returncipher.doFinal(data);
104 }
105 /**
106 * @param args
107 * @throws UnsupportedEncodingException
108 * @throws Exception
109 */
110 public static void main(String[] args) {
111
112 String str="AES";
113 System.out.println("原文:"+str);
114
115 //初始化密钥
116 byte[] key;
117 try {
118 key = AES256Encryption.initkey();
119 System.out.print("密钥:");
120 for(int i = 0;i<key.length;i++){
121 System.out.printf("%x", key[i]);
122 }
123 System.out.print("\n");
124 //加密数据
125 byte[] data=AES256Encryption.encrypt(str.getBytes(), key);
126 System.out.print("加密后:");
127 for(int i = 0;i<data.length;i++){
128 System.out.printf("%x", data[i]);
129 }
130 System.out.print("\n");
131
132 //解密数据
133 data=AES256Encryption.decrypt(data, key);
134 System.out.println("解密后:"+newString(data));
135 } catch (Exception e) {
136 // TODO Auto-generated catch block
137 e.printStackTrace();
138 }
139
140 }
141 }
运行程序后的结果截图:
ViewController.m文件
01 //
02 // ViewController.m
03 // AES256EncryptionDemo
04 //
05 // Created by 孙 裔 on 12-12-13.
06 // Copyright (c) 2012年 rich sun. All rights reserved.
07 //
08
09 #import "ViewController.h"
10 #import "EncryptAndDecrypt.h"
11
12 @interface ViewController ()
13
14 @end
15
16 @implementation ViewController
17 @synthesize plainTextField;
18 - (void)viewDidLoad
19 {
20 [super viewDidLoad];
21 // Do any additional setup after loading the view, typically from a nib.
22 }
23
24 - (void)didReceiveMemoryWarning
25 {
26 [super didReceiveMemoryWarning];
27 // Dispose of any resources that can be recreated.
28 }
29 //这个函数实现了用户输入完后点击视图背景,关闭键盘
30 - (IBAction)backgroundTap:(id)sender{
31 [plainTextField resignFirstResponder];
32 }
33
34 - (IBAction)encrypt:(id)sender {
35
36 NSString *plainText = plainTextField.text;//明文
37 NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
38
39 //为了测试,这里先把密钥写死
40 Byte keyByte[] = {0x08,0x08,0x04,0x0b,0x02,0x0f,0x0b,0x0c,0x01,0x03,0x09,0x07,0x0c,0x03,
41 0x07,0x0a,0x04,0x0f,0x06,0x0f,0x0e,0x09,0x05,0x01,0x0a,0x0a,0x01,0x09,
42 0x06,0x07,0x09,0x0d};
43 //byte转换为NSData类型,以便下边加密方法的调用
44 NSData *keyData = [[NSData alloc] initWithBytes:keyByte length:32];
45 //
46 NSData *cipherTextData = [plainTextData AES256EncryptWithKey:keyData];
47 Byte *plainTextByte = (Byte *)[cipherTextData bytes];
48 for(int i=0;i<[cipherTextData length];i++){
49 printf("%x",plainTextByte[i]);
50 }
51
52 }
53 @end