GPU支持大规模的并行加速运算,胜在量上,CPU处理大量的并行运算显得力不从心,它是胜在逻辑上。利用显卡加速的应用越来越多,但如果说GPU即将或最终将替代CPU还有点言过其实,二者最终将优势互补,各尽所能。

使用显卡的无脑并行运算破解密码是一个不错的选择。这里选择一种简单的情况,限定密码是6位纯数字,并且不限定输入次数,这种 情况下可以使用GPU暴力破解,当然仅供娱乐,并无任何实际的应用价值。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>
#include "time.h" using namespace std; //密码破解入口函数
cudaError_t BreakWithCuda(const int *userKeyWord, int *keyWordByGPU); //密码破解核函数
__global__ void BreakPasswordKernel(const int *userKeyWord, int *keyWordByGPU)
{
//获取线程的索引号
int blockId = blockIdx.y*gridDim.x + blockIdx.x;
int threadID = blockId*blockDim.x + threadIdx.x;
if (threadID == *userKeyWord)
{
*keyWordByGPU = threadID;
}
} int main()
{
int userWord = 0; //用户输入的密码
int keyWordByGPU = 0; //接收GPU破解的密码
cout << "请输入你设置的密码(6位阿拉伯数字):" << endl;
cin >> userWord;
const int keyWord = userWord;
getchar(); //计算耗时变量
clock_t startTime, endTime;
startTime = clock(); cudaError_t cudaStatus = BreakWithCuda(&keyWord, &keyWordByGPU);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "BreakWithCuda failed!");
return 1;
} //重置GPU设备
cudaStatus = cudaDeviceReset();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceReset failed!");
return 1;
} cout << "\n经GPU运算破解的用户密码是:" << endl; //输出破解的密码,不足6位前补0
cout.fill('0');
cout.width(6); //总长度6位
cout << keyWordByGPU << endl << endl; endTime = clock(); //破解耗时,以秒位单位
float spendTime = (float)(endTime - startTime) / CLOCKS_PER_SEC;
cout << "耗时:\n" << spendTime << "seconds" << endl; getchar();
return 0;
} cudaError_t BreakWithCuda(const int *userKeyword, int *keyWordByGPU)
{
int *dev_userKeyWord = 0;
int *dev_keyWordByGPU = 0;
cudaError_t cudaStatus; //选择运行设备
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
goto Error;
} // 在GUP上分配显存
cudaStatus = cudaMalloc((void**)&dev_userKeyWord, sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
cudaStatus = cudaMalloc((void**)&dev_keyWordByGPU, sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
} // 把用户输入的密码从主机复制到设备显存上
cudaStatus = cudaMemcpy(dev_userKeyWord, userKeyword, sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
} dim3 grid(100, 100); //创建一个包含100*100个线程块的Grid
BreakPasswordKernel << <grid, 100 >> > (dev_userKeyWord, dev_keyWordByGPU); // GPU运行错误检查
cudaStatus = cudaGetLastError();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "BreakPasswordKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
goto Error;
} // cudaDeviceSynchronize waits for the kernel to finish, and returns
// any errors encountered during the launch.
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching BreakPasswordKernel!\n", cudaStatus);
goto Error;
} // 把破解的密码从GPU拷贝到CPU
cudaStatus = cudaMemcpy(keyWordByGPU, dev_keyWordByGPU, sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
} Error:
cudaFree(dev_keyWordByGPU);
cudaFree(dev_userKeyWord); return cudaStatus;
}

运行后提示用户输入6位密码,第一位可以为0,如果检测到最终破解的密码不足6位,则可以判断用户在第一位输入的数字是0,所以自动在密码前补上0,补足6位

输入的密码第一位或之后若干位为0的情况:

正常情况:

CUDA—使用GPU暴力破解密码的更多相关文章

  1. python 暴力破解密码脚本

    python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...

  2. 教你用免费的hihttps开源WEB应用防火墙阻止暴力破解密码

    教你用免费的hihttps开源WEB应用防火墙阻止暴力破解密码 很多企业都有自己的网站,需要用户登录后才能访问,但有大量的黑客攻击软件可以暴力破解网站密码,即使破解不了也非常恶心.有没有免费的解决办法 ...

  3. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 防止暴力破解密码、提高大型信息系统安全

    几十万人使用的系统.覆盖全国.每天营业额上好几个亿的.若信息安全方面太薄弱了.那将会是致命的打击.甚至威胁到企业的正常运转.从国家层面到企业级别大家都在重视信息的安全.可控. 运行速度慢一点点可以忍受 ...

  4. Windows Server 2016 服务器总是有暴力破解密码导致的审核失败

    最近看了一下公司服务器的日志,在安全里,总是有审核失败,特别烦人,尝试密码特别弱智,总是用Administrator做用户名,不停的变换密码,真的烦,用户里面根本就没有Administrator,早就 ...

  5. ASP.NET基础学习(暴力破解密码)

    首先写出一段登陆程序: //ashx端 <%@ WebHandler Language="C#" Class="AddCalation" %> us ...

  6. L inux系统安全及应用---暴力破解密码

    系统安全及应用一.开关机安全控制① 调整BIOS引导设置② GRUB限制二.终端登录安全控制① 限制root只在安全终端登录② 禁止普通用户登录举例三.系统弱口令检测① Joth the Ripper ...

  7. 用python 编写redis 暴力破解密码的程序

    本文摘自http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/ import redisimport l ...

  8. Centos下防止暴力破解密码 - Denyhost

    参考: http://www.centoscn.com/shell/2015/0703/5781.html 从http://sourceforge.net/projects/denyhosts/fil ...

  9. Centos下防止ssh暴力破解密码

    参考文章地址:https://yq.aliyun.com/ziliao/48446 https://www.cnblogs.com/lsdb/p/7095288.html 1.收集 /var/log/ ...

随机推荐

  1. HTML 5 中FileReader的使用

    FileReader 接口主要用来把文件读入到内存中,而且读取文件里的数据.FileReader接口提供了一个异步API,使用该API能够在浏览器主线程中异步訪问文件系统 ,读取文件里的数据. Fil ...

  2. POS 60域用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 自定义域(Reserved Private) 1.变量属性 N...17(LLLVAR),3个字节的长度值+最大17个字节的数字字符域. 压缩时用 ...

  3. 12.2 linux USB框架分析(详细注册match匹配过程)

     首先我们先来简单说一说USB的框架,之后在来具体分析源码,以便加深理解!其实USB的框架比较像“平台总线.设备.驱动”的框架,也分为总线.设备.驱动三大块.其中总线驱动是已经由内核完成的,一旦接入u ...

  4. Bluetooth---初步了解Android 蓝牙4.0

    http://developer.android.com/reference/android/bluetooth/package-summary.html android.bluttooth 提供管理 ...

  5. inflate, findViewById与setContentView的区别与联系 分类: H1_ANDROID 2014-04-18 22:54 1119人阅读 评论(0) 收藏

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...

  6. Android 输入框弹出样式

    在androidMainfest.xml文件里 在Activity中设置 [A]stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 [B]stateU ...

  7. CoreData使用方法二:NSFetchedResultsController实例操作与解说

    学习了NSFetchedResultsController.才深深的体会到coredata的牛逼之处.原来Apple公司弄个新技术.不是平白无故的去弄,会给代码执行到来非常大的优点.coredata不 ...

  8. 【oracle11g ,19】索引管理

    一.索引的分类: 1.逻辑上分为:  单列索引和复合索引  唯一索引和非唯一索引  函数索引 domain索引 2.物理上分:  分区索引和非分区索引 b-tree  bitmap 注意:表和索引最好 ...

  9. 20+ 个很有用的 jQuery 的 Google 地图插件 (英语)

    20+ 个很有用的 jQuery 的 Google 地图插件 (英语) 一.总结 一句话总结:英语提上来我才能快速去google上面找资源啊.google上面的资源要比百度丰富很多,然后有了英语就可以 ...

  10. UE4.5.0的Kinect插件(Plugin)---插件使用说明<二>

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43563959 一.起因: 写了个UE4的Kinect的插件,结 ...