2024-08-23



package main
 
import (
    "golang.org/x/crypto/ssh"
    "golang.org/x/crypto/ssh/terminal"
    "io/ioutil"
    "log"
    "os"
)
 
func main() {
    // 读取私钥文件
    privateKey, err := ioutil.ReadFile("path/to/private/key")
    if err != nil {
        log.Fatalf("unable to read private key: %v", err)
    }
 
    // 创建SSH签名签名
    signer, err := ssh.ParsePrivateKey(privateKey)
    if err != nil {
        log.Fatalf("unable to parse private key: %v", err)
    }
 
    // 创建SSH客户端配置
    config := &ssh.ClientConfig{
        User: "username",
        Auth: []ssh.AuthMethod{
            ssh.PublicKeys(signer),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 用于学习目的,不推荐在生产环境中使用
    }
 
    // 连接SSH服务器
    client, err := ssh.Dial("tcp", "server.com:22", config)
    if err != nil {
        log.Fatalf("unable to connect: %v", err)
    }
    defer client.Close()
 
    // 建立会话
    session, err := client.NewSession()
    if err != nil {
        log.Fatalf("unable to create session: %v", err)
    }
    defer session.Close()
 
    // 设置会话的标准输入、输出和错误输出
    session.Stdin = os.Stdin
    session.Stdout = os.Stdout
    session.Stderr = os.Stderr
    session.Run("/bin/date") // 执行远程命令
}

这段代码展示了如何使用Go语言通过SSH协议连接到一个远程服务器,并执行一个简单的命令。它使用了golang.org/x/crypto/ssh包来处理SSH密钥交换和加密算法。代码中包含了错误处理,并且为了简洁起见,忽略了主机密钥的检查,通常在生产环境中不推荐这么做。

2024-08-23



package main
 
import (
    "fmt"
    "time"
)
 
// TokenBucketLimiter 表示令牌桶限流器
type TokenBucketLimiter struct {
    rate         int           // 令牌产生的速率(每秒产生令牌的数量)
    tokens       int           // 当前持有的令牌数
    lastTime     time.Time     // 上次更新令牌的时间
    maxTokens    int           // 最大令牌数
    tokenChannel chan struct{} // 用于同步的通道
}
 
// NewTokenBucketLimiter 创建一个新的令牌桶限流器
func NewTokenBucketLimiter(rate int, maxTokens int) *TokenBucketLimiter {
    return &TokenBucketLimiter{
        rate:         rate,
        tokens:       maxTokens,
        lastTime:     time.Now(),
        maxTokens:    maxTokens,
        tokenChannel: make(chan struct{}, maxTokens),
    }
}
 
// Wait 等待获取令牌
func (l *TokenBucketLimiter) Wait() {
    // 添加令牌
    l.addTokens()
 
    // 尝试获取令牌
    select {
    case l.tokenChannel <- struct{}{}:
        // 成功获取令牌,继续执行
    default:
        // 无法获取令牌,等待或抛出错误
        time.Sleep(100 * time.Millisecond)
        l.Wait() // 递归等待
    }
}
 
// addTokens 添加新的令牌到令牌桶中
func (l *TokenBucketLimiter) addTokens() {
    now := time.Now()
    elapsed := now.Sub(l.lastTime).Seconds()
    l.lastTime = now
    toAdd := int(elapsed * l.rate)
 
    if toAdd > 0 {
        l.tokens += toAdd
        if l.tokens > l.maxTokens {
            l.tokens = l.maxTokens
        }
    }
}
 
func main() {
    // 创建限流器,速率为每秒1个令牌
    limiter := NewTokenBucketLimiter(1, 2)
 
    // 模拟5个并发请求
    for i := 0; i < 5; i++ {
        go func() {
            for {
                limiter.Wait() // 等待获取令牌
                fmt.Println("处理请求")
                time.Sleep(500 * time.Millisecond) // 模拟请求处理时间
            }
        }()
    }
 
    // 主线程无限循环,模拟服务运行
    for {
        time.Sleep(1 * time.Second)
    }
}

这段代码实现了一个简单的令牌桶限流器,并在main函数中通过模拟并发请求的方式展示了其使用方式。它定义了TokenBucketLimiter结构体,并提供了创建新限流器和等待获取令牌的方法。addTokens函数负责根据时间添加令牌到桶中。在main函数中,我们创建了一个限流器,并启动了5个并行的goroutine来模拟并发请求,每个请求都会在执行前等待获取令牌。

2024-08-23



package main
 
import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "regexp"
    "strconv"
    "strings"
)
 
func main() {
    // 设置要请求的验证码地址
    captchaUrl := "http://example.com/captcha"
    client := &http.Client{}
 
    // 请求验证码
    resp, err := client.Get(captchaUrl)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
 
    // 读取验证码图片
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
 
    // 此处应该调用图像识别算法来识别验证码,但是这里假设我们已经知道了验证码是 "1234"
    captchaId := "1234"
 
    // 构建表单数据
    data := url.Values{
        "captchaId": {captchaId},
    }
 
    // 构建请求体
    reqBody := strings.NewReader(data.Encode())
 
    // 请求验证码验证接口
    req, err := http.NewRequest("POST", "http://example.com/captcha/check", reqBody)
    if err != nil {
        panic(err)
    }
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Content-Length", strconv.Itoa(len(data.Encode())))
 
    // 发送请求并读取响应
    resp, err = client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
 
    // 读取响应内容
    respBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
 
    // 输出结果
    fmt.Println(string(respBody))
}

这段代码模拟了一个简单的验证码破解流程。它首先请求验证码图片,然后使用一个假设的验证码 "1234" 去请求验证接口。在实际应用中,验证码的内容需要通过图像识别算法来获取。代码中省略了算法的实现细节,假设已经有一个可以识别验证码的函数。最后,它发送验证请求并输出结果。这个过程可以作为破解验证码流程的一个基本框架。

2024-08-23

在C语言中,实现凯撒密码的核心函数可以如下:




#include <stdio.h>
#include <string.h>
 
void caesar_encrypt(char *input, int key) {
    int i;
    for (i = 0; input[i] != '\0'; i++) {
        if ((input[i] >= 'a' && input_[i] <= 'z') || (input[i] >= 'A' && input[i] <= 'Z')) {
            input[i] = ((input[i] - 'A' + key) % 26) + 'A';
        }
    }
}
 
int main() {
    char input[] = "HELLOWORLD";
    int key = 4; // 例如,我们的密钥是 4
    caesar_encrypt(input, key);
    printf("加密后的字符串是: %s\n", input);
    return 0;
}

这段代码实现了基本的凯撒密码加密功能。在实际应用中,加密和解密通常需要更复杂的实现,包括密钥管理、随机化处理、模块算术等。而RSA加密算法则涉及大整数的计算以及可能的模反元素求解,其C语言实现通常依赖于外部库,如GMP或者开源的RSA库。

2024-08-23



<?php
namespace Fangcloud;
 
/**
 * 国密SM4算法类
 *
 * 注意:本代码仅作为参考,实际使用时需要进行安全性测试,并确保符合所在项目的要求。
 */
class GmUtil {
 
    const BLOCK_SIZE = 16; // SM4分块大小
 
    /**
     * 加密
     * @param string $key 密钥
     * @param string $plaintext 明文
     * @return string 密文
     */
    public static function sm4Encrypt($key, $plaintext) {
        $key = self::keyExpand($key);
        $blockSize = self::BLOCK_SIZE;
        $plaintextLen = strlen($plaintext);
        $paddingLen = $blockSize - ($plaintextLen % $blockSize);
        $plaintext = str_pad($plaintext, $plaintextLen + $paddingLen, chr($paddingLen));
        $blockCount = ceil(strlen($plaintext) / $blockSize);
 
        $ciphertext = '';
        for ($i = 0; $i < $blockCount; $i++) {
            $ciphertext .= self::sm4F($plaintext . substr($key, $i * 16, 16), $i, $key);
        }
 
        return $ciphertext;
    }
 
    /**
     * 解密
     * @param string $key 密钥
     * @param string $ciphertext 密文
     * @return string 明文
     */
    public static function sm4Decrypt($key, $ciphertext) {
        $key = self::keyExpand($key);
        $blockSize = self::BLOCK_SIZE;
        $blockCount = strlen($ciphertext) / $blockSize;
 
        $plaintext = '';
        for ($i = 0; $i < $blockCount; $i++) {
            $plaintext .= self::sm4InvF(substr($ciphertext, $i * 16, 16), $i, $key);
        }
 
        // 去除填充
        $paddingLen = ord($plaintext[strlen($plaintext) - 1]);
        return substr($plaintext, 0, strlen($plaintext) - $paddingLen);
    }
 
    // 这里省略了sm4F和sm4InvF的具体实现,因为它们涉及到具体的算法细节。
    // 实现时需要参照SM4算法标准和具体的编程语言特性来完成。
 
    /**
     * 密钥扩展
     * @param string $key 原始密钥
     * @return string 扩展后的密钥
     */
    private static function keyExpand($key) {
        // 扩展密钥的具体实现代码
        // 根据SM4算法标准来实现
    }
 
    // 这里省略了sm4F和sm4InvF的具体实现,因为它们涉及到具体的算法细节。
    // 实现时需要参照SM4算法标准和具体的编程语言特性来完成。
}
 
// 使用示例
$key = '1234567890abcdef'; // 密钥应该是16个字节
$plaintext = 'hello, this is a test'; // 需要加密的数据
$ciphertext = GmUtil::sm4Encrypt($key, $plaintext);
echo "密文: " . bin2hex($ciphertext) . "\n";
 
$decryptedText = GmUtil::sm4Decrypt($key, $ciphertext);
echo "解密后的明文: " . $decryptedText . "\n";

在这个代码示例中,我们定义了一个GmUtil类,其中包含了sm4Encryptsm4Decrypt两个方法,分别用于实现SM4的加密和解密。需要注意的是,具体的\`sm4F

2024-08-23



<?php
namespace Fangcloud;
 
/**
 * 国密SM2算法的PHP实现
 * 
 * @author 老马
 */
class SM2 {
    // 省略其他代码...
 
    /**
     * 生成密钥对
     * @return array 包含私钥和公钥的数组
     */
    public static function generateKeyPair() {
        $privateKey = self::generatePrivateKey();
        $publicKey = self::getPublicKeyFromPrivateKey($privateKey);
        return array('privateKey' => $privateKey, 'publicKey' => $publicKey);
    }
 
    // 省略其他代码...
}
 
// 使用方法示例
$keyPair = SM2::generateKeyPair();
echo "私钥:\n";
echo $keyPair['privateKey'] . "\n";
echo "公钥:\n";
echo $keyPair['publicKey'] . "\n";

这个代码实例展示了如何使用SM2类生成一对密钥,并打印出私钥和公钥。这个简单的例子展示了如何在PHP中使用类和方法来完成加密任务,同时也说明了如何在实际应用中使用这个类。

2024-08-23

在Nuxt 3中,你可以创建一个可重用的HTTP客户端来封装HTTP请求逻辑。以下是一个使用哈希算法生成key的简单例子:

首先,安装cross-fetch,因为Nuxt 3中不包含全局的fetch




npm install cross-fetch

然后,创建一个http.js文件来封装HTTP请求:




// http.js
import { createHash } from 'crypto';
import fetch from 'cross-fetch';
 
const generateKey = (url, method, body) => {
  const hash = createHash('sha256');
  hash.update(url);
  hash.update(method);
  hash.update(body || '');
  return hash.digest('hex');
};
 
const httpClient = async (url, options = {}) => {
  const { method = 'GET', body } = options;
  const key = generateKey(url, method, body);
 
  try {
    const response = await fetch(url, { method, body, ...options });
    if (!response.ok) {
      const error = new Error(response.statusText);
      error.status = response.status;
      throw error;
    }
    return {
      key,
      data: await response.json(),
    };
  } catch (error) {
    error.key = key;
    throw error;
  }
};
 
export default httpClient;

在Nuxt 3组件或页面中使用封装的HTTP客户端:




// some-component.vue
<script setup>
import httpClient from '~/path/to/http.js';
 
const fetchData = async () => {
  try {
    const { key, data } = await httpClient('https://api.example.com/data', {
      method: 'POST',
      body: JSON.stringify({ some: 'data' }),
    });
    console.log('Key:', key);
    console.log('Data:', data);
  } catch (error) {
    console.error('Error:', error);
  }
};
</script>

在这个例子中,httpClient函数接受一个URL和一个选项对象,其中可以包含HTTP方法和请求体。它使用crypto模块的createHash方法来生成一个基于请求的URL、HTTP方法和请求体的哈希key。如果响应不是OK,它会抛出一个包含key的错误。在组件中,你可以调用httpClient来发送请求,并处理响应或错误。

2024-08-23



// 定义一个函数,接收一个字符串参数,并返回一个对象
// 对象中包含字符串的常见操作的结果
function performStringOperations(input: string): { [key: string]: any } {
    return {
        // substring(start, end) 方法用于提取字符串的一部分,并返回新的子字符串
        subString: input.substring(1, 4),
 
        // indexOf(searchValue, fromIndex) 方法返回指定值在字符串中首次出现的索引位置
        indexOfA: input.indexOf('A', 2),
 
        // slice(start, end) 方法提取字符串的一部分,并返回新的子字符串
        slicedString: input.slice(2, 5),
 
        // replace(regexp/substr, newSubstr|function) 方法返回一个新的字符串,
        // 其中出现的匹配原字符串中的一些或所有匹配都被替换了
        replacedString: input.replace(/A/g, 'B')
    };
}
 
// 测试函数
const testString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const result = performStringOperations(testString);
 
console.log(result);

这段代码定义了一个performStringOperations函数,它接收一个字符串作为参数,并返回一个对象,该对象包含了字符串的substringindexOfslicereplace操作的结果。然后,我们创建了一个测试字符串并调用了该函数,打印出返回的结果对象。这个例子展示了如何在TypeScript中使用字符串操作方法,并且提供了一个简单的参考实现。

2024-08-22

以下是一个使用TypeScript实现的BASE64编码和解码的简单例子:




// 定义一个BASE64编码的映射表
const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
// BASE64编码函数
function encode(input: string): string {
  let output = "";
  let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  let i = 0;
 
  input = utf8_encode(input);
 
  while (i < input.length) {
    chr1 = input.charCodeAt(i++);
    chr2 = input.charCodeAt(i++);
    chr3 = input.charCodeAt(i++);
 
    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;
 
    if (isNaN(chr2)) {
      enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
      enc4 = 64;
    }
 
    output +=
      keyStr.charAt(enc1) +
      keyStr.charAt(enc2) +
      keyStr.charAt(enc3) +
      keyStr.charAt(enc4);
  }
 
  return output;
}
 
// BASE64解码函数
function decode(input: string): string {
  let output = "";
  let chr1, chr2, chr3;
  let enc1, enc2, enc3, enc4;
  let i = 0;
 
  // 移除所有非BASE64字符
  input = input.replace(/[^A-Za-z0-9+\/=]/g, "");
 
  while (i < input.length) {
    enc1 = keyStr.indexOf(input.charAt(i++));
    enc2 = keyStr.indexOf(input.charAt(i++));
    enc3 = keyStr.indexOf(input.charAt(i++));
    enc4 = keyStr.indexOf(input.charAt(i++));
 
    chr1 = (enc1 << 2) | (enc2 >> 4);
    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    chr3 = ((enc3 & 3) << 6) | enc4;
 
    output += String.fromCharCode(chr1);
 
    if (enc3 !== 64) {
      output += String.fromCharCode(chr2);
    }
    if (enc4 !== 64) {
      output += String.fromCharCode(chr3);
    }
  }
 
  output = utf8_decode(output);
 
  return output;
}
 
// UTF-8编码函数(用于内部处理)
function utf8_encode(string: string): string {
  string = string.replace(/\r\n/g, "\n");
  let utfText = "";
 
  for (let n = 0; n < string.length; n++) {
    const c = string.charCodeAt(n);
 
    if (c < 128) {
      utfText += String.fromCharCode(c);
    } else if (c > 127 && c < 2048) {
      utfText += String.fromCharCode((c >> 6) | 192);
      utfText += String.fromCharCode((c & 63) | 128);
    } else {
      utfText += String.fromCharCode((c >> 12) | 224);
      utfText += String.fromCharCode(((c >> 6) & 63) | 128);
      utfText += String.fromCharCode((c & 63) | 128);
    }
  }
 
 
2024-08-22

在Node.js环境中,可以使用crypto-js模块来进行加密和解密操作。以下是使用crypto-js进行AES加密和解密的示例代码:

首先,需要安装crypto-js模块:




npm install crypto-js

然后,可以使用以下代码进行加密和解密:




const CryptoJS = require("crypto-js");
 
// 加密
const message = "需要加密的信息";
const secretKey = "秘钥";
const encrypted = CryptoJS.AES.encrypt(message, secretKey).toString();
console.log('加密后的信息:', encrypted);
 
// 解密
const decryptedBytes = CryptoJS.AES.decrypt(encrypted, secretKey);
const decryptedMessage = decryptedBytes.toString(CryptoJS.enc.Utf8);
console.log('解密后的信息:', decryptedMessage);

请注意,在实际应用中,秘钥应当保密且复杂,并且在使用加密信息的时候,需要确保秘钥的安全传输,避免泄露。