Non-programmers, please ignore the following emphasized text, as you will find it tedious and boring. Skip ahead to the juicy stuff. SafeDisc encryption is done in the application at the code level. You include the SafeDisc libraries and specify which functions are to be encrypted. These functions must be declared as standard C functions within the global scope, and can be given any of five levels of "security". Each level runs slower than the previous, and provides better encryption. The fastest check a developer can encrypt a function with runs at 50 milliseconds. The level five check takes about ten seconds to process. From a cracking standpoint, using the higher level checks means that end users may have to run their "unSafeDisc" cracking program for ten to thirty seconds instead of the split second it would normally take to crack the game. That's the problem with using a common encryption library. The crackers only need to figure it out once.
One of the conveniences of SafeDisc as a developer, is that your functions are merely tagged with information for the SafeDisc generator. This information is ignored until the actual mastering happens, so your application can be run freely without worrying about the encryption. Unfortunately, this also means that you're not likely to see the performance hit you're going to suffer until you're gold mastering. The worst example of this so far that I am aware of is Morrowind, which upon original release had encrypted one of its basic functions that was run every game update. As a result, people who removed the SafeDisc encryption with a "unSafeDisc" tool had better performance than those who didn't. Since this was such a cutting edge game, which was already slow to begin with, people who would normally never even care about removing copy protection were stripping it from their games just so they could play it at a reasonable speed. The first patch released for Morrowind remedied this, presumably by moving the checks into more uncommon code blocks.