皮皮网

【下载站采集源码】【游戏引擎源码分析】【html框架源码下载】cef3 源码

2024-12-29 01:45:08 来源:kingdee源码

1.如何利用CEF3创建一个简单的应用程序
2.我想把java文件先加密然后打包,请高手指教怎么加密,有那种好的加密算法吗?
3.Qt中嵌入web网页的几种实现方式

cef3 源码

如何利用CEF3创建一个简单的应用程序

       cefsimple项目中默认加载的URL是 google.com,当然,你也可以用自定义的 URL 去替代它,最方便的就是通过命令行搞定。

       # Load the local file “c:\example\example.html”

       cefsimple.exe --url=file://c:/example/example.html

       é™¤äº†å‘½ä»¤è¡Œçš„方法,也可以通过直接修改在 cefsimple/simple.cpp 文件中的代码,达到你的目的。

       # Load the local file “c:\example\example.html”

       â€¦

       if (url.empty())

       url = file://c:/example/example.html;

       åº”用程序组成

       æ‰€æœ‰çš„ CEF 应用程序都有一下主要组成部分:

       CEF 的动态链接库 。(在 Windows 平台下就是 libcef.dll)

       æ”¯æŒåº“。(ICU, FFMPEG等)

       èµ„源。(html/js/css, strings等)

       å®¢æˆ·ç«¯æ‰§è¡Œæ–‡ä»¶ã€‚(本教程中就是 cefsimple.exe.)

       è¦ç‚¹ï¼ˆå¿…看)

       CEF 使用的是多进程。应用程序主进程是浏览器进程,而其他子进程是由 renderer, plugins, GPU等创建。

       åœ¨ Windows 和 Linux 平台下的执行文件可以被主进程和子进程使用。

       CEF 中所有进程都可以是多线程的。CEF提供了许多功能和接口在不同的线程中传递任务。

       ä¸€äº›å›žè°ƒæ–¹æ³•å’Œå‡½æ•°åªèƒ½åœ¨ç‰¹å®šçš„进程或者线程中使用。在你第一次使用新的回调方法或者函数之前,请确保你已经阅读了 API 头文件中源码,看使用要求。

       æµç¨‹åˆ†æž

       cefsimple 应用程序首先初始化CEF,然后创建了一个简单的弹出浏览器窗口。当关闭了所有的浏览器窗口,应用程序就会结束。程序执行流程如下:

       ç³»ç»Ÿæ‰§è¡Œå…¥å£ç‚¹å‡½æ•°(main or wWinMain),并创建浏览器进程。

       å…¥å£ç‚¹å‡½æ•°ï¼š

       åˆ›å»ºèƒ½å¤Ÿå¤„理进程级别的回调方法的 SimpleApp 实例。

       åˆå§‹åŒ– CEF,进入 CEF 消息循环。

       åˆå§‹åŒ– CEF 之后,调用 SimpleApp::OnContextInitialized() 。这个方法中:

       åˆ›å»ºå•ä¾‹çš„ SimpleHandler 。

       ç”± CefBrowserHost::CreateBrowsersync() 方法创建一个浏览器窗口。

       æ‰€æœ‰çš„浏览器共享 SimpleHandler 实例, 此实例能定制浏览器行为、处理浏览器相关回调方法(life span, loading state, title display等)。

       å½“一个浏览器窗口关闭的时候,调用 SimpleHandler::OnBeforeClose() 。当所有的浏览器窗口全部关闭时,OnBeforeClose() 函数就会执行跳出 CEF 消息循环的行为,退出应用程序。

       å…¥å£ç‚¹å‡½æ•°

       ç¨‹åºçš„运行开始于浏览器进程中的入口点函数。这个函数会初始化 CEF 以及所有跟操作系统有关的对象。

       Windows

       #include <windows.h>

       #include "cefsimple/simple_app.h"

       #include "include/cef_sandbox_win.h"

       // Set to 0 to disable sandbox support.

       #define CEF_ENABLE_SANDBOX 1

       #if CEF_ENABLE_SANDBOX

       // The cef_sandbox.lib static library is currently built with VS. It may not

       // link successfully with other VS versions.

       #pragma comment(lib, "cef_sandbox.lib")

       #endif

       // Entry point function for all processes.

       int APIENTRY wWinMain(HINSTANCE hInstance,

       HINSTANCE hPrevInstance,

       LPTSTR lpCmdLine,

       int nCmdShow) {

       UNREFERENCED_PARAMETER(hPrevInstance);

       UNREFERENCED_PARAMETER(lpCmdLine);

       void* sandbox_info = NULL;

       #if CEF_ENABLE_SANDBOX

       // Manage the life span of the sandbox information object. This is necessary

       // for sandbox support on Windows. See cef_sandbox_win.h for complete details.

       CefScopedSandboxInfo scoped_sandbox;

       sandbox_info = scoped_sandbox.sandbox_info();

       #endif

       // Provide CEF with command-line arguments.

       CefMainArgs main_args(hInstance);

       // SimpleApp implements application-level callbacks. It will create the first

       // browser instance in OnContextInitialized() after CEF has initialized.

       CefRefPtr<SimpleApp> app(new SimpleApp);

       // CEF applications have multiple sub-processes (render, plugin, GPU, etc)

       // that share the same executable. This function checks the command-line and,

       // if this is a sub-process, executes the appropriate logic.

       int exit_code = CefExecuteProcess(main_args, app.get(), sandbox_info);

       if (exit_code >= 0) {

       // The sub-process has completed so return here.

       return exit_code;

       }

       // Specify CEF global settings here.

       CefSettings settings;

       #if !CEF_ENABLE_SANDBOX

       settings.no_sandbox = true;

       #endif

       // Initialize CEF.

       CefInitialize(main_args, settings, app.get(), sandbox_info);

       // Run the CEF message loop. This will block until CefQuitMessageLoop() is

       // called.

       CefRunMessageLoop();

       // Shut down CEF.

       CefShutdown();

       return 0;

       }

       SimpleApp

       SimpleApp 负责处理进程级别的回调方法。它会曝露出一些在多进程中共享或者被特定进程使用的接口和方法。CefBrowserProcessHandler 接口,在浏览器进程中调用。还有一个被分离出 CefBrowserProcessHandler 接口(例子项目没有展示)只会在渲染进程中被调用。由于 CefBrowserProcessHandler 不光实现了 CefApp, 同时还有 CefBrowserProcessHandler,所以它的返回值必须是[this]。

       // simple_app.h

       #include "include/cef_app.h"

       class SimpleApp : public CefApp,

       public CefBrowserProcessHandler {

       public:

       SimpleApp();

       // CefApp methods:

       virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()

       OVERRIDE { return this; }

       // CefBrowserProcessHandler methods:

       virtual void OnContextInitialized() OVERRIDE;

       private:

       // Include the default reference counting implementation.

       IMPLEMENT_REFCOUNTING(SimpleApp);

       };

       // simple_app.cpp

       #include "cefsimple/simple_app.h"

       #include <string>

       #include "cefsimple/simple_handler.h"

       #include "cefsimple/util.h"

       #include "include/cef_browser.h"

       #include "include/cef_command_line.h"

       SimpleApp::SimpleApp() {

       }

       void SimpleApp::OnContextInitialized() {

       REQUIRE_UI_THREAD();

       // Information used when creating the native window.

       CefWindowInfo window_info;

       #if defined(OS_WIN)

       // On Windows we need to specify certain flags that will be passed to

       // CreateWindowEx().

       window_info.SetAsPopup(NULL, "cefsimple");

       #endif

       // SimpleHandler implements browser-level callbacks.

       CefRefPtr<SimpleHandler> handler(new SimpleHandler());

       // Specify CEF browser settings here.

       CefBrowserSettings browser_settings;

       std::string url;

       // Check if a "--url=" value was provided via the command-line. If so, use

       // that instead of the default URL.

       CefRefPtr<CefCommandLine> command_line =

       CefCommandLine::GetGlobalCommandLine();

       url = command_line->GetSwitchValue("url");

       if (url.empty())

       url = "xxx";

       // Create the first browser window.

       CefBrowserHost::CreateBrowserSync(window_info, handler.get(), url,

       browser_settings, NULL);

       }

       SimpleHandler

       SimpleHandler 负责处理浏览器级别的回调方法。这些回调方法会在浏览器进程中执行。在这个项目中,针对所有的浏览器使用相同的 CefClient 实例,但是如果你愿意,可以在自己的应用程序中使用不同的 CefClient实例的。

       // simple_handler.h

       #include "include/cef_client.h"

       #include <list>

       class SimpleHandler : public CefClient,

       public CefDisplayHandler,

       public CefLifeSpanHandler,

       public CefLoadHandler {

       public:

       SimpleHandler();

       ~SimpleHandler();

       // Provide access to the single global instance of this object.

       static SimpleHandler* GetInstance();

       // CefClient methods:

       virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE {

       return this;

       }

       virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE {

       return this;

       }

       virtual CefRefPtr<CefLoadHandler> GetLoadHandler() OVERRIDE {

       return this;

       }

       // CefDisplayHandler methods:

       virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,

       const CefString& title) OVERRIDE;

       // CefLifeSpanHandler methods:

       virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;

       virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;

       // CefLoadHandler methods:

       virtual void OnLoadError(CefRefPtr<CefBrowser> browser,

       CefRefPtr<CefFrame> frame,

       ErrorCode errorCode,

       const CefString& errorText,

       const CefString& failedUrl) OVERRIDE;

       // Request that all existing browser windows close.

       void CloseAllBrowsers(bool force_close);

       private:

       // List of existing browser windows. Only accessed on the CEF UI thread.

       typedef std::list<CefRefPtr<CefBrowser> > BrowserList;

       BrowserList browser_list_;

       // Include the default reference counting implementation.

       IMPLEMENT_REFCOUNTING(SimpleHandler);

       };

       // simple_handler.cpp

       #include "cefsimple/simple_handler.h"

       #include <sstream>

       #include <string>

       #include "cefsimple/util.h"

       #include "include/cef_app.h"

       #include "include/cef_runnable.h"

       namespace {

       SimpleHandler* g_instance = NULL;

       } // namespace

       SimpleHandler::SimpleHandler() {

       ASSERT(!g_instance);

       g_instance = this;

       }

       SimpleHandler::~SimpleHandler() {

       g_instance = NULL;

       }

       // static

       SimpleHandler* SimpleHandler::GetInstance() {

       return g_instance;

       }

       void SimpleHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {

       REQUIRE_UI_THREAD();

       // Add to the list of existing browsers.

       browser_list_.push_back(browser);

       }

       void SimpleHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {

       REQUIRE_UI_THREAD();

       // Remove from the list of existing browsers.

       BrowserList::iterator bit = browser_list_.begin();

       for (; bit != browser_list_.end(); ++bit) {

       if ((*bit)->IsSame(browser)) {

       browser_list_.erase(bit);

       break;

       }

       }

       if (browser_list_.empty()) {

       // All browser windows have closed. Quit the application message loop.

       CefQuitMessageLoop();

       }

       }

       void SimpleHandler::OnLoadError(CefRefPtr<CefBrowser> browser,

       CefRefPtr<CefFrame> frame,

       ErrorCode errorCode,

       const CefString& errorText,

       const CefString& failedUrl) {

       REQUIRE_UI_THREAD();

       // Don't display an error for downloaded files.

       if (errorCode == ERR_ABORTED)

       return;

       // Display a load error message.

       std::stringstream ss;

       ss << "<html><body bgcolor=\"white\">"

       "<h2>Failed to load URL " << std::string(failedUrl) <<

       " with error " << std::string(errorText) << " (" << errorCode <<

       ").</h2></body></html>";

       frame->LoadString(ss.str(), failedUrl);

       }

我想把java文件先加密然后打包,请高手指教怎么加密,有那种好的加密算法吗?

       RSA算法非常简单,概述如下:

       找两素数p和q

       取n=p*q

       取t=(p-1)*(q-1)

       取任何一个数e,下载站采集源码要求满足e<t并且e与t互素(就是最大公因数为1)

       取d*e%t==1

       这样最终得到三个数: n d e

       设消息为数M (M <n)

       设c=(M**d)%n就得到了加密后的消息c

       设m=(c**e)%n则 m == M,从而完成对c的解密。

       注:**表示次方,上面两式中的d和e可以互换。

       在对称加密中:

       n d两个数构成公钥,可以告诉别人;

       n e两个数构成私钥,e自己保留,不让任何人知道。游戏引擎源码分析

       给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。

       别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。

       rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解

       从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法

       求得d。

       <二>实践

       接下来我们来一个实践,看看实际的操作:

       找两个素数:

       p=

       q=

       这样

       n=p*q=

       t=(p-1)*(q-1)=

       取e=,满足e<t并且e和t互素

       用perl简单穷举可以获得满主 e*d%t ==1的数d:

       C:\Temp>perl -e "foreach $i (1..){ print($i),last if $i*%==1 }"

       

       即d=

       最终我们获得关键的

       n=

       d=

       e=

       取消息M=我们看看

       加密:

       c=M**d%n = **%

       用perl的大数计算来算一下:

       C:\Temp>perl -Mbigint -e "print **%"

       

       即用d对M加密后获得加密信息c=

       解密:

       我们可以用e来对加密后的c进行解密,还原M:

       m=c**e%n=**% :

       C:\Temp>perl -Mbigint -e "print **%"

       

       即用e对c解密后获得m= ,html框架源码下载 该值和原始信息M相等。

       <三>字符串加密

       把上面的过程集成一下我们就能实现一个对字符串加密解密的示例了。

       每次取字符串中的一个字符的ascii值作为M进行计算,其输出为加密后进制

       的数的字符串形式,按3字节表示,如F

       代码如下:

       #!/usr/bin/perl -w

       #RSA 计算过程学习程序编写的测试程序

       #watercloud -8-

       #

       use strict;

       use Math::BigInt;

       my %RSA_CORE = (n=>,e=>,d=>); #p=,q=

       my $N=new Math::BigInt($RSA_CORE{ n});

       my $E=new Math::BigInt($RSA_CORE{ e});

       my $D=new Math::BigInt($RSA_CORE{ d});

       print "N=$N D=$D E=$E\n";

       sub RSA_ENCRYPT

       {

       my $r_mess = shift @_;

       my ($c,$i,$M,$C,$cmess);

       for($i=0;$i < length($$r_mess);$i++)

       {

       $c=ord(substr($$r_mess,$i,1));

       $M=Math::BigInt->new($c);

       $C=$M->copy(); $C->bmodpow($D,$N);

       $c=sprintf "%X",$C;

       $cmess.=$c;

       }

       return \$cmess;

       }

       sub RSA_DECRYPT

       {

       my $r_mess = shift @_;

       my ($c,$i,$M,$C,$dmess);

       for($i=0;$i < length($$r_mess);$i+=3)

       {

       $c=substr($$r_mess,$i,3);

       $c=hex($c);

       $M=Math::BigInt->new($c);

       $C=$M->copy(); $C->bmodpow($E,$N);

       $c=chr($C);

       $dmess.=$c;

       }

       return \$dmess;

       }

       my $mess="RSA 娃哈哈哈~~~";

       $mess=$ARGV[0] if @ARGV >= 1;

       print "原始串:",$mess,"\n";

       my $r_cmess = RSA_ENCRYPT(\$mess);

       print "加密串:",$$r_cmess,"\n";

       my $r_dmess = RSA_DECRYPT($r_cmess);

       print "解密串:",$$r_dmess,"\n";

       #EOF

       测试一下:

       C:\Temp>perl rsa-test.pl

       N= D= E=

       原始串:RSA 娃哈哈哈~~~

       加密串:5CB6CD6BCAAAA0AAA0AAA6CACACA4

       解密串:RSA 娃哈哈哈~~~

       C:\Temp>perl rsa-test.pl 安全焦点(xfocus)

       N= D= E=

       原始串:安全焦点(xfocus)

       加密串:ECF0AE0AADD7BADCFDCDB

       解密串:安全焦点(xfocus)

       <四>提高

       前面已经提到,rsa的安全来源于n足够大,我们测试中使用的n是非常小的,根本不能保障安全性,

       我们可以通过RSAKit、RSATool之类的工具获得足够大的N 及D E。

       通过工具,汽车订票系统源码我们获得位的N及D E来测试一下:

       n=0xCDFCDEBEBBBBCEECC2BCE7B5FCDFBEC3AFD

       BDCDED9BDFCB3C4CAFADDFC7A6BFDADEDBC4FF9CCFD4CBB

       DECBCAB5DB9EE5AD2D7BE7ABFBEDDD2EDCCAED7E2

       BC

       d=0x

       e=0xEAACDE1E8E3D7DCF9CEFEFE8CEBBBBCBA9DADDCC

       4C5DBEECA8CEC3BAFEB9EABDBABEAFF2

       C4DD8B1CCA9D8B4B7A3C9EEFFF3AAFCDDA1DCABEABDAD2B

       

       设原始信息

       M=0x

       完成这么大数字的计算依赖于大数运算库,用perl来运算非常简单:

       A) 用d对M进行加密如下:

       c=M**d%n :

       C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x

       , 0x, 0xCDFCDEBEBBBBCEECC2BCE7B5F

       CDFBEC3AFDBDCDED9BDFCB3C4CAFADDFC7A6BFDADEDBC4F0

       F9CCFD4CBBDECBCAB5DB9EE5AD2D7BE7ABFBEDD6

       D2EDCCAED7E2BC);print $x->as_hex"

       0xbbececd7cabacfccbbd8abdea8dbdbd

       bf3a2f7c5f5aa1defafa8eed1d4cc4bebc0a1dcecaa6b

       fa3bec0cbfd8adadbc5e8bedaddd2acdeab

       fc3f6d

       即用d对M加密后信息为:

       c=0xbbececd7cabacfccbbd8abdea8dbdbd

       bf3a2f7c5f5aa1defafa8eed1d4cc4bebc0a1dcecaa6b

       fa3bec0cbfd8adadbc5e8bedaddd2acdeab

       fc3f6d

       B) 用e对c进行解密如下:

       m=c**e%n :

       C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0xbbececd7cab

       acfccbbd8abdea8dbdbdbf3a2f7c5f5aa1def3

       afa8eed1d4cc4bebc0a1dcecaa6bfa3bec0cb

       fd8adadbc5e8bedaddd2acdeabfc3f6d, 0xEA

       ACDE1E8E3D7DCF9CEFEFE8CEBBBBCBA9DADDCCC5D

       BEECA8CEC3BAFEB9EABDBABEAFF

       2C4DD8B1CCA9D8B4B7A3C9EEFFF3AAFCDDA1DCABEABDA

       D2B, 0xCDFCDEBEBBBBCEECC2BCE7B5FCDF

       BEC3AFDBDCDED9BDFCB3C4CAFADDFC7A6BFDADEDBC4FF9CCF

       D4CBBDECBCAB5DB9EE5AD2D7BE7ABFBEDD

       D2EDCCAED7E2BC);print $x->as_hex"

       0x

       (我的P4 1.6G的机器上计算了约5秒钟)

       得到用e解密后的m=0x == M

       C) RSA通常的实现

       RSA简洁幽雅,但计算速度比较慢,通常加密中并不是直接使用RSA 来对所有的信息进行加密,

       最常见的情况是随机产生一个对称加密的密钥,然后使用对称加密算法对信息加密,之后用

       RSA对刚才的加密密钥进行加密。

       最后需要说明的是,当前小于位的N已经被证明是不安全的

       自己使用中不要使用小于位的RSA,最好使用位的。

       ----------------------------------------------------------

       一个简单的网络教育平台源码RSA算法实现JAVA源代码:

       filename:RSA.java

       /

*

       * Created on Mar 3,

       

*

       * TODO To change the template for this generated file go to

       * Window - Preferences - Java - Code Style - Code Templates

       */

       import java.math.BigInteger;

       import java.io.InputStream;

       import java.io.OutputStream;

       import java.io.FileInputStream;

       import java.io.FileOutputStream;

       import java.io.FileNotFoundException;

       import java.io.IOException;

       import java.io.FileWriter;

       import java.io.FileReader;

       import java.io.BufferedReader;

       import java.util.StringTokenizer;

       /

**

       * @author Steve

       

*

       * TODO To change the template for this generated type comment go to

       * Window - Preferences - Java - Code Style - Code Templates

       */

       public class RSA {

       /

**

       * BigInteger.ZERO

       */

       private static final BigInteger ZERO = BigInteger.ZERO;

       /

**

       * BigInteger.ONE

       */

       private static final BigInteger ONE = BigInteger.ONE;

       /

**

       * Pseudo BigInteger.TWO

       */

       private static final BigInteger TWO = new BigInteger("2");

       private BigInteger myKey;

       private BigInteger myMod;

       private int blockSize;

       public RSA (BigInteger key, BigInteger n, int b) {

       myKey = key;

       myMod = n;

       blockSize = b;

       }

       public void encodeFile (String filename) {

       byte[] bytes = new byte[blockSize / 8 + 1];

       byte[] temp;

       int tempLen;

       InputStream is = null;

       FileWriter writer = null;

       try {

       is = new FileInputStream(filename);

       writer = new FileWriter(filename + ".enc");

       }

       catch (FileNotFoundException e1){

       System.out.println("File not found: " + filename);

       }

       catch (IOException e1){

       System.out.println("File not found: " + filename + ".enc");

       }

       /

**

       * Write encoded message to 'filename'.enc

       */

       try {

       while ((tempLen = is.read(bytes, 1, blockSize / 8)) > 0) {

       for (int i = tempLen + 1; i < bytes.length; ++i) {

       bytes[i] = 0;

       }

       writer.write(encodeDecode(new BigInteger(bytes)) + " ");

       }

       }

       catch (IOException e1) {

       System.out.println("error writing to file");

       }

       /

**

       * Close input stream and file writer

       */

       try {

       is.close();

       writer.close();

       }

       catch (IOException e1) {

       System.out.println("Error closing file.");

       }

       }

       public void decodeFile (String filename) {

       FileReader reader = null;

       OutputStream os = null;

       try {

       reader = new FileReader(filename);

       os = new FileOutputStream(filename.replaceAll(".enc", ".dec"));

       }

       catch (FileNotFoundException e1) {

       if (reader == null)

       System.out.println("File not found: " + filename);

       else

       System.out.println("File not found: " + filename.replaceAll(".enc", "dec"));

       }

       BufferedReader br = new BufferedReader(reader);

       int offset;

       byte[] temp, toFile;

       StringTokenizer st = null;

       try {

       while (br.ready()) {

       st = new StringTokenizer(br.readLine());

       while (st.hasMoreTokens()){

       toFile = encodeDecode(new BigInteger(st.nextToken())).toByteArray();

       System.out.println(toFile.length + " x " + (blockSize / 8));

       if (toFile[0] == 0 && toFile.length != (blockSize / 8)) {

       temp = new byte[blockSize / 8];

       offset = temp.length - toFile.length;

       for (int i = toFile.length - 1; (i <= 0) && ((i + offset) <= 0); --i) {

       temp[i + offset] = toFile[i];

       }

       toFile = temp;

       }

       /*if (toFile.length != ((blockSize / 8) + 1)){

       temp = new byte[(blockSize / 8) + 1];

       System.out.println(toFile.length + " x " + temp.length);

       for (int i = 1; i < temp.length; i++) {

       temp[i] = toFile[i - 1];

       }

       toFile = temp;

       }

       else

       System.out.println(toFile.length + " " + ((blockSize / 8) + 1));*/

       os.write(toFile);

       }

       }

       }

       catch (IOException e1) {

       System.out.println("Something went wrong");

       }

       /

**

       * close data streams

       */

       try {

       os.close();

       reader.close();

       }

       catch (IOException e1) {

       System.out.println("Error closing file.");

       }

       }

       /

**

       * Performs <tt>base</tt>^<sup><tt>pow</tt></sup> within the modular

       * domain of <tt>mod</tt>.

       

*

       * @param base the base to be raised

       * @param pow the power to which the base will be raisded

       * @param mod the modular domain over which to perform this operation

       * @return <tt>base</tt>^<sup><tt>pow</tt></sup> within the modular

       * domain of <tt>mod</tt>.

       */

       public BigInteger encodeDecode(BigInteger base) {

       BigInteger a = ONE;

       BigInteger s = base;

       BigInteger n = myKey;

       while (!n.equals(ZERO)) {

       if(!n.mod(TWO).equals(ZERO))

       a = a.multiply(s).mod(myMod);

       s = s.pow(2).mod(myMod);

       n = n.divide(TWO);

       }

       return a;

       }

       }

       在这里提供两个版本的RSA算法JAVA实现的代码下载:

       1. 来自于 /code.aspx?ID= 的RSA算法实现源代码包:

       /rsa/

       

参考资料:

/product/showarticle.asp?id=

Qt中嵌入web网页的几种实现方式

       Web网页的界面交互相较于Qt客户端拥有较大优势,能提供丰富且便捷的用户体验,使得在客户端中嵌入web网页成为可能。这能结合web的优势与客户端特性,丰富界面功能。本文将介绍几种Qt客户端中嵌入web网页的实现方式及步骤。

       基于Qt自带控件实现

       Qt内置的控件用于访问网页,集成webkit内核与google引擎,类似简易版浏览器。此方案在Qt5.9.6中采用QWebEngineView。

       环境配置:Qt5.9.6 + VS

       检查webenginewidgets模块是否配置成功。

       开发流程:通过拖拽控件或直接new使用,代码示例与效果展示。

       总结:实现简单,但浏览器内核不支持视频解码,需编译源码解决,成本较高。

       嵌入Chrome.exe进程实现

       此方法启动本地Chrome浏览器,实现与本地浏览器功能等同。通过启动浏览器进程并传入参数,再获取窗口句柄,实现嵌入。

       环境配置:Qt5.9.6 + VS

       检测Chrome安装情况,获取Chrome.exe路径。

       开发流程:启动Chrome.exe,获取窗口句柄,转化为QWindow,嵌入界面。

       总结:功能完整,但浏览器状态与客户端状态耦合,用户行为影响嵌入界面显示。

       基于Chrome的CEF3实现

       Chromium Embedded Framework(CEF)提供嵌入式浏览器支持。此方案需下载编译包,参照官方文档,实现嵌入网页界面。

       环境配置:Qt5.9.6 + VS

       下载并配置CEF与chromium源码。

       开发流程:参考示例文档,配置工程,实现嵌入。

       总结:功能完整,但受限于源码编译环境,实际使用效果受限。

       基于微软的WebView2实现

       Microsoft Edge WebView2 控件允许嵌入Web技术(HTML、CSS、JavaScript)到本机应用程序。此方案通过读取进程窗口句柄实现嵌入。

       环境配置:Qt5.9.6 + VS,安装WebView2运行包。

       开发流程:下载示例文档,配置NuGet包,启动WebView2进程,读取窗口句柄,嵌入界面。

       总结:实现简单,功能与用户体验较好,但无法国产化。

       总结

       根据需求选择不同方案:仅显示网页时,推荐基于Qt自带控件;需视频播放时,考虑基于CEF的实现;受限环境,可选用WebView2。嵌入Chrome.exe方案存在不可控因素,不适合作为常规方案。通过比较不同方法的优缺点,可选最优方案满足需求。