Подробное объяснение метода шифрования MD5 Encryption_md5.
Подробное объяснение метода шифрования MD5 Encryption_md5.

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Подробное объяснение шифрования MD5

Введение:

Я нашел введение в MD5 в энциклопедии Baidu и суммировал из него некоторую важную информацию:

  Message Digest Algorithm MD5(Китайское имяалгоритм обобщения информациипятое издание)Хэш-функция, широко используемая в области компьютерной безопасности.,Чтобы обеспечить защиту целостности сообщений.

 Алгоритму MD4 также необходимо дополнить информацию, чтобы гарантировать, что длина информации минус 448 делится на 512 (модуль длины битов информации). 512 = 448). Затем добавляется 64-битное двоичное представление исходной длины сообщения. Информация обрабатывается блоками по 512-битных итераций Дамгерда/Меркла, и каждый блок обрабатывается в три разных этапа.

1991 год,RivestРазработать более технически зрелуюMD5алгоритм。Добавляет в MD4 концепцию «ремней безопасности».。ХотяMD5СравниватьMD4Более сложный,Но это безопаснее. Этот алгоритм, очевидно, состоит из четырех шагов, которые немного отличаются от конструкции MD4. В алгоритме MD5,Размер информационного дайджеста и необходимость заполнения точно такие же, как и для MD4.

Описание алгоритма:

Краткое описание алгоритма:верноMD5алгоритм简要的叙述可к为:MD5к512Группировка битов для обработки входной информации,И каждая группа разделена на 16 32-битных подгрупп.,После серии обработок,Выходные данные алгоритма состоят из четырех 32-битных пакетов.,Объединение этих четырех 32-битных блоков даст 128-битное хэш-значение.

Подробное описание алгоритма:

Язык кода:javascript
копировать
В алгоритме MD5,Сначала необходимо заполнить информацию,Результат придания его битовой длины по модулю 512 равен 448. поэтому,Разрядность информации (Биты Длина) будет увеличена до N*512+448, N — неотрицательное целое число, а N может быть равно нулю. Метод заполнения следующий: после информации заполняйте 1 и бесчисленное количество 0 и прекращайте заполнение информации 0 до тех пор, пока не будут выполнены вышеуказанные условия. Затем к этому результату добавляется длина информации предварительного заполнения, выраженная в 64-битном двоичном формате. После этих двух этапов обработки битовая длина информации равна =N*512+448+64=(N+1)*512, то есть длина в точности равна целому числу, кратному 512. Причиной этого является соблюдение требований к длине информации при последующей обработке. Общий процесс показан на рисунке ниже: Представляет i-ю группу. Каждая операция выполняется над 128-битным значением результата предыдущего раунда и 512-битным значением i-го блока. Начальное 128-битное значение является начальной переменной ссылки. Эти параметры используются в первом раунде операций и выражаются в порядке байтов с обратным порядком байтов. Они следующие: A=0x67452301, B=0xefcdab89, C=0x98badcfe, D=0x10325476. . Общая блок-схема алгоритма MD5 Общая блок-схема алгоритма MD5[1] Алгоритм работы каждой группы следующий: Первая группа должна связать четыре вышеупомянутые переменные с четырьмя другими переменными: A с a, B с b, C с c и D с d. Переменные, начиная со второй группы, являются результатами операций предыдущей группы. Основной цикл состоит из четырех раундов (в MD4 всего три раунда), и каждый цикл очень похож. В первом туре 16 операций. Каждая операция выполняет операцию нелинейной функции над тремя из a, b, c и d, а затем добавляет результат к четвертой переменной, подгруппе текста и константе. Затем переместите результат влево на неопределенное число и добавьте одно из a, b, c или d. Наконец, замените одно из a, b, c или d этим результатом. Ниже приведены четыре нелинейные функции, используемые в каждой операции (по одной на раунд). F(X,Y,Z) =(X&Y)|((~X)&Z) G(X,Y,Z) =(X&Z)|(Y&(~Z)) H(X,Y,Z) =X^Y^Z I(X,Y,Z)=Y^(X|(~Z)) (&;с,| есть или,~Пожалуйста, приходите,^Исключающее ИЛИ) Объяснение этих четырех функций: Если соответствующие биты X, Y и Z независимы и однородны, то каждый бит результата также должен быть независимым и однородным. F — это функция, которая действует постепенно. То есть если Х, то Y, иначе Z. Функция H является оператором побитовой четности. Предположим, Mj представляет j-ю подгруппу сообщения (от 0 до 15), константа ti — это целая часть 4294967296*abs(sin(i)), i находится в диапазоне от 1 до 64, а единица измерения — радианы. (4294967296 равно 2 в 32-й степени) FF(a,b,c,d,Mj,s,ti) означает a = b + ((a + F(b,c,d) + Mj + ti) << s) GG(a,b,c,d,Mj,s,ti) означает a = b + ((a + G(b,c,d) + Mj + ti) << s) HH(a,b,c,d,Mj,s,ti) означает a = b + ((a + H(b,c,d) + Mj + ti) << s) Ⅱ (a, b, c, d, Mj, s, ti) означает a = b + ((a + I(b,c,d) + Mj + ti) << s) Четыре раунда (64 шага): первый раунд FF(a,b,c,d,M0,7,0xd76aa478) FF(d,a,b,c,M1,12,0xe8c7b756) FF(c,d,a,b,M2,17,0x242070db) FF(b,c,d,a,M3,22,0xc1bdceee) FF(a,b,c,d,M4,7,0xf57c0faf) FF(d,a,b,c,M5,12,0x4787c62a) FF(c,d,a,b,M6,17,0xa8304613) FF(b,c,d,a,M7,22,0xfd469501) FF(a,b,c,d,M8,7,0x698098d8) FF(d,a,b,c,M9,12,0x8b44f7af) FF(c,d,a,b,M10,17,0xffff5bb1) FF(b,c,d,a,M11,22,0x895cd7be) FF(a,b,c,d,M12,7,0x6b901122) FF(d,a,b,c,M13,12,0xfd987193) FF(c,d,a,b,M14,17,0xa679438e) FF(b,c,d,a,M15,22,0x49b40821) второй раунд GG(a,b,c,d,M1,5,0xf61e2562) GG(d,a,b,c,M6,9,0xc040b340) GG(c,d,a,b,M11,14,0x265e5a51) GG(b,c,d,a,M0,20,0xe9b6c7aa) GG(a,b,c,d,M5,5,0xd62f105d) GG(d,a,b,c,M10,9,0x02441453) GG(c,d,a,b,M15,14,0xd8a1e681) GG(b,c,d,a,M4,20,0xe7d3fbc8) GG(a,b,c,d,M9,5,0x21e1cde6) GG(d,a,b,c,M14,9,0xc33707d6) GG(c,d,a,b,M3,14,0xf4d50d87) GG(b,c,d,a,M8,20,0x455a14ed) GG(a,b,c,d,M13,5,0xa9e3e905) GG(d,a,b,c,M2,9,0xfcefa3f8) GG(c,d,a,b,M7,14,0x676f02d9) GG(b,c,d,a,M12,20,0x8d2a4c8a) третий раунд HH(a,b,c,d,M5,4,0xfffa3942) HH(d,a,b,c,M8,11,0x8771f681) HH(c,d,a,b,M11,16,0x6d9d6122) HH(b,c,d,a,M14,23,0xfde5380c) HH(a,b,c,d,M1,4,0xa4beea44) HH(d,a,b,c,M4,11,0x4bdecfa9) HH(c,d,a,b,M7,16,0xf6bb4b60) HH(b,c,d,a,M10,23,0xbebfbc70) HH(a,b,c,d,M13,4,0x289b7ec6) HH(d,a,b,c,M0,11,0xeaa127fa) HH(c,d,a,b,M3,16,0xd4ef3085) HH(b,c,d,a,M6,23,0x04881d05) HH(a,b,c,d,M9,4,0xd9d4d039) HH(d,a,b,c,M12,11,0xe6db99e5) HH(c,d,a,b,M15,16,0x1fa27cf8) HH(b,c,d,a,M2,23,0xc4ac5665) четвертый раунд Ⅱ(a,b,c,d,M0,6,0xf4292244) Ⅱ(d,a,b,c,M7,10,0x432aff97) Ⅱ(c,d,a,b,M14,15,0xab9423a7) Ⅱ(b,c,d,a,M5,21,0xfc93a039) Ⅱ(a,b,c,d,M12,6,0x655b59c3) Ⅱ(d,a,b,c,M3,10,0x8f0ccc92) Ⅱ(c,d,a,b,M10,15,0xffeff47d) Ⅱ(b,c,d,a,M1,21,0x85845dd1) Ⅱ(a,b,c,d,M8,6,0x6fa87e4f) Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0) Ⅱ(c,d,a,b,M6,15,0xa3014314) Ⅱ(b,c,d,a,M13,21,0x4e0811a1) Ⅱ(a,b,c,d,M4,6,0xf7537e82) Ⅱ(d,a,b,c,M11,10,0xbd3af235) Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb) Ⅱ(b,c,d,a,M9,21,0xeb86d391) После того, как все это будет сделано, добавьте a, b, c, d к A, B, C и D соответственно. Затем продолжите выполнение алгоритма со следующей группой данных, и окончательным результатом будет каскад A, B, C и D.

View Code

Выше приведено полное введение в MD5.,Но когда я тестировал,На Baidu проблема с 4-мя 32-битными начальными значениями,Я еще раз поискал в Википедии. проверено,Начальное значение, указанное в Википедии, верно.。上面的алгоритм详细描述中我也已经改过了这四个初始ценить。

Библиотека алгоритмов MD5 C++:

Язык кода:javascript
копировать
<***Этот файл MD5.h ***> #ifndef MD5_H #define MD5_H #include <iostream> #include <cstring> #include <fstream> #include <stdio.h> /* Type define */ typedef unsigned char byte; typedef unsigned long ulong; using std::string; using std::ifstream; /* MD5 declaration. */ class MD5 { public: MD5(); MD5(const void *input, size_t length); MD5(const string &str); MD5(ifstream &in); void PrintMD5(const string &str, MD5 &md5);//РаспечататьMD5ценить void update(const void *input, size_t length);//Следующие функции обновления добавляются связанным образом void update(const string &str); void update(ifstream &in); const byte* digest(); string toString(); void сброс();//Инициализируем private: void update(const byte *input, size_t length); void final(); void transform(const byte block[64]); void encode(const ulong *input, byte *output, size_t length); void decode(const byte *input, ulong *output, size_t length);//Преобразуем в шестнадцатеричный формат string bytesToHexString(const byte *input, size_t length); /* class uncopyable */ MD5(const MD5&); MD5& operator=(const MD5&); private: ulong _state[4]; /* state (ABCD) */ ulong _count[2]; /* number of bits, modulo 2^64 (low-order word first) */ byte _buffer[64]; /* input buffer */ byte _digest[16]; /* message digest */ bool _finished; /* calculate finished ? */ static const byte PADDING[64]; /* padding for calculate */ static const char HEX[16]; static const size_t BUFFER_SIZE = 1024; }; #endif/*MD5_H*/
Язык кода:javascript
копировать
/*
* Совет: Эта строка кода слишком длинная, и система автоматически комментирует ее, не выделяя. Один клик копировать удалит системные комментарии 
* <***ЭтоMD5.cpp документ***> #include "md5.h" using namespace std; /* Constants for MD5Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { \ (a) += F ((b), (c), (d)) + (x) + ac; \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + ac; \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + ac; \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + ac; \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } const byte MD5::PADDING[64] = { 0x80 }; const char MD5::HEX[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /* Default construct. */ MD5::MD5() { reset(); } /* Construct a MD5 object with a input buffer. */ MD5::MD5(const void *input, size_t length) { reset(); update(input, length); } /* Construct a MD5 object with a string. */ MD5::MD5(const string &str) { reset(); update(str); } /* Construct a MD5 object with a file. */ MD5::MD5(ifstream &in) { reset(); update(in); } /* Return the message-digest */ const byte* MD5::digest() { if (!_finished) { _finished = true; final(); } return _digest; } /* Reset the calculate state */ void MD5::reset() { _finished = false; /* reset number of bits. */ _count[0] = _count[1] = 0; /* Load magic initialization constants. */ _state[0] = 0x67452301; _state[1] = 0xefcdab89; _state[2] = 0x98badcfe; _state[3] = 0x10325476; } /* Updating the context with a input buffer. */ void MD5::update(const void *input, size_t length) { update((const byte*)input, length); } /* Updating the context with a string. */ void MD5::update(const string &str) { update((const byte*)str.c_str(), str.length()); } /* Updating the context with a file. */ void MD5::update(ifstream &in) { if (!in) return; std::streamsize length; char buffer[BUFFER_SIZE]; while (!in.eof()) { in.read(buffer, BUFFER_SIZE); length = in.gcount(); if (length > 0) update(buffer, length); } in.close(); } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void MD5::update(const byte *input, size_t length) { ulong i, index, partLen; _finished = false; /* Compute number of bytes mod 64 */ index = (ulong)((_count[0] >> 3) & 0x3f); /* update number of bits */ if((_count[0] += ((ulong)length << 3)) < ((ulong)length << 3)) _count[1]++; _count[1] += ((ulong)length >> 29); partLen = 64 - index; /* transform as many times as possible. */ if(length >= partLen) { memcpy(&_buffer[index], input, partLen); transform(_buffer); for (i = partLen; i + 63 < length; i += 64) transform(&input[i]); index = 0; } else { i = 0; } /* Buffer remaining input */ memcpy(&_buffer[index], &input[i], length-i); } /* MD5 finalization. Ends an MD5 message-_digest operation, writing the the message _digest and zeroizing the context. */ void MD5::final() { byte bits[8]; ulong oldState[4]; ulong oldCount[2]; ulong index, padLen; /* Save current state and count. */ memcpy(oldState, _state, 16); memcpy(oldCount, _count, 8); /* Save number of bits */ encode(_count, bits, 8); /* Pad out to 56 mod 64. */ index = (ulong)((_count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); update(PADDING, padLen); /* Append length (before padding) */ update(bits, 8); /* Store state in digest */ encode(_state, _digest, 16); /* Restore current state and count. */ memcpy(_state, oldState, 16); memcpy(_count, oldCount, 8); } /* MD5 basic transformation. Transforms _state based on block. */ void MD5::transform(const byte block[64]) { ulong a = _state[0], b = _state[1], c = _state[2], d = _state[3], x[16]; decode(block, x, 64); /* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ _state[0] += a; _state[1] += b; _state[2] += c; _state[3] += d; } /* Encodes input (ulong) into output (byte). Assumes length is a multiple of 4. */ void MD5::encode(const ulong *input, byte *output, size_t length) { for(size_t i=0, j=0; j<length; i++, j+=4) { output[j]= (byte)(input[i] & 0xff); output[j+1] = (byte)((input[i] >> 8) & 0xff); output[j+2] = (byte)((input[i] >> 16) & 0xff); output[j+3] = (byte)((input[i] >> 24) & 0xff); } } /* Decodes input (byte) into output (ulong). Assumes length is a multiple of 4. */ void MD5::decode(const byte *input, ulong *output, size_t length) { for(size_t i=0, j=0; j<length; i++, j+=4) { output[i] = ((ulong)input[j]) | (((ulong)input[j+1]) << 8) | (((ulong)input[j+2]) << 16) | (((ulong)input[j+3]) << 24); } } /* Convert byte array to hex string. */ string MD5::bytesToHexString(const byte *input, size_t length) { string str; str.reserve(length << 1); for(size_t i = 0; i < length; i++) { int t = input[i]; int a = t / 16; int b = t % 16; str.append(1, HEX[a]); str.append(1, HEX[b]); } return str; } /* Convert digest to string value */ string MD5::toString() { return bytesToHexString(digest(), 16); } void MD5::PrintMD5(const string &str, MD5 &md5) { cout << "MD5(\"" << str << "\") = " << md5.toString() << endl; }
*/

Тестовый файл:

Язык кода:javascript
копировать
#include "md5.h" #include <iostream> using namespace std; int main() { MD5 md5; md5.update(""); md5.PrintMD5("", md5); md5.update("a"); md5.PrintMD5("a", md5); md5.update("bc"); md5.PrintMD5("abc", md5); md5.update("defghijklmnopqrstuvwxyz"); md5.PrintMD5("abcdefghijklmnopqrstuvwxyz", md5); md5.reset(); md5.update("message digest"); md5.PrintMD5("message digest", md5); md5.reset(); return 0; }

Примечание. Приведенный выше код был протестирован мной и может быть запущен. Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение!

Замечания автора:

  Процесс шифрования был слишком сложен, поэтому мне пришлось записать его в записанном виде.

  Этот MD5 был успешно активирован. Предполагается, что вы уже знаете значение шифрования MD5, прежде чем сможете активировать успешное руководство. Я также загрузил статью профессора Ван Сяоюня «Учебное пособие по успешной активации MD5» и загрузил ее на Baidu Netdisk, адрес следующий:

Ссылка: http://pan.baidu.com/s/1hqmPe7q Пароль: ah7w

  Однако эта статья полностью на английском языке. Китайская версия может быть переведена неправильно, поэтому читатели должны прочитать ее самостоятельно.

Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/166550.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose